O DataWorks oferece o nó MaxCompute Script, que permite o desenvolvimento em modo de script com base no mecanismo SQL do MaxCompute 2.0. Este tópico descreve como usar o nó MaxCompute Script.
Contexto
O mecanismo SQL do MaxCompute suporta o modo de script, que combina várias instruções SQL em um único script, compilado e executado como uma unidade. Esse recurso é útil para consultas complexas, como subconsultas aninhadas ou operações que exigem múltiplas etapas. Ao enviar todo o script de uma vez, você gera um plano de execução unificado, e o job é enfileirado e executado apenas uma vez. Essa abordagem usa os recursos de forma mais eficiente. Para obter mais informações, consulte Modo de script SQL. No DataWorks, use o nó MaxCompute Script para criar e agendar tarefas baseadas em scripts.
Caso de uso
O modo de script é ideal para reescrever subconsultas profundamente aninhadas ou dividir lógicas complexas em várias instruções.
Por exemplo, nesse modo, atribua uma constante a uma variável e use uma instrução SELECT * FROM variable para convertê-la em um escalar, permitindo seu uso em cálculos com outras colunas. A constante também pode ser armazenada em uma tabela de linha única. Veja o exemplo a seguir. Para a sintaxe de conversão, consulte Subconsulta (SUBQUERY).
@a := SELECT 10; -- Assign the constant 10 to @a. Alternatively, assign a value from a single-row table t1, such as SELECT col1 FROM t1. @b := SELECT key,VALUE+(SELECT FROM @a) FROM t2 WHERE key >10000; -- Calculate a new value by using the value column from table t2 and the value from @a. SELECT FROM @b;
Evite usar um único script com variáveis de tabela para combinar fontes de dados que ficam prontas em horários significativamente diferentes (por exemplo, uma fonte pronta às 01:00 e outra às 07:00). O job não será iniciado até que todos os dados estejam disponíveis, o que pode causar atrasos consideráveis.
Pré-requisitos
Você já vinculou um mecanismo de computação MaxCompute ao workspace do DataWorks.
Verifique se as tabelas necessárias foram criadas no MaxCompute e preenchidas com dados de amostra. Para obter detalhes, consulte Instruções de criação de tabela e dados de amostra.
Sintaxe
Um script completo do MaxCompute segue esta ordem: SET statement > DDL statement > DML statement. Cada tipo pode ter zero ou mais instruções, mas não é possível intercalá-las. Instruções que começam com um sinal de arroba (@) declaram variáveis para passar resultados entre as instruções. A sintaxe é a seguinte:
--SET statements SET odps.sql.type.system.odps2=true; [SET odps.stage.reducer.num=***;] [...] --DDL statements CREATE TABLE table1 xxx; [CREATE TABLE table2 xxx;] [...] --DML statements @var1 := SELECT [ALL | DISTINCT] select_expr, select_expr, ... FROM table3 [WHERE where_condition]; @var2 := SELECT [ALL | DISTINCT] select_expr, select_expr, ... FROM table4 [WHERE where_condition]; @var3 := SELECT [ALL | DISTINCT] var1.select_expr, var2.select_expr, ... FROM @var1 JOIN @var2 ON ...; INSERT OVERWRITE|INTO TABLE [PARTITION (partcol1=val1, partcol2=val2 ...)] SELECT [ALL | DISTINCT] select_expr, select_expr, ... FROM @var3; [@var4 := SELECT [ALL | DISTINCT] var1.select_expr, var.select_expr, ... FROM @var1 UNION ALL | UNION SELECT [ALL | DISTINCT] var1.select_expr, var.select_expr, ... FROM @var2; CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name AS SELECT [ALL | DISTINCT] select_expr, select_expr, ... FROM var4;]
Limitações
As seguintes restrições se aplicam ao nó MaxCompute Script:
O modo de script suporta instruções SET, instruções DML e algumas instruções DDL. Instruções DDL que exibem resultados na tela, como
DESCeSHOW, não são suportadas.Um script pode conter no máximo uma instrução que exiba resultados na tela, como uma instrução
SELECTindependente. Caso contrário, o sistema retorna um erro. Não execute instruçõesSELECTde exibição de tela em scripts.É permitida apenas uma instrução
CREATE TABLE ASpor script, e ela deve ser a última instrução. Escreva as instruções de criação de tabela e as instruçõesINSERTseparadamente.Se qualquer instrução falhar no modo de script, todas as instruções do script falharão.
Nesse modo, um job para processamento de dados é gerado somente após todos os dados de entrada estarem prontos.
-
O sistema retorna um erro se uma tabela for lida após ter sido gravada.
Exemplo incorreto:
INSERT OVERWRITE TABLE src2 SELECT * FROM src WHERE key > 0; @a := SELECT * FROM src2; SELECT * FROM @a;Exemplo correto:
Para evitar problemas de leitura após gravação, faça a seguinte modificação.
@a := SELECT * FROM src WHERE key > 0; INSERT OVERWRITE TABLE src2 SELECT * FROM @a; SELECT * FROM @a;
Criar um nó MaxCompute Script
Para obter informações sobre como criar um nó, consulte Criar um nó MaxCompute Script.
Desenvolver um nó MaxCompute Script
Na página de edição do nó MaxCompute Script, selecione os exemplos de script abaixo conforme suas necessidades de negócio para o desenvolvimento.
Desenvolvimento básico de scripts
No modo de script do MaxCompute, o processo de compilação SQL é direto. O exemplo simples a seguir demonstra como usar o nó MaxCompute Script.
CREATE TABLE IF NOT EXISTS dest(key string , VALUE bigint) ;
CREATE TABLE IF NOT EXISTS dest2(key string,VALUE bigint ) ;
@a := SELECT * FROM src WHERE VALUE >0;
@b := SELECT * FROM src2 WHERE key IS NOT NULL;
@c := SELECT * FROM src3 WHERE VALUE IS NOT NULL;
@d := SELECT a.key,b.value FROM @a LEFT OUTER JOIN @b ON a.key=b.key AND b.value>0;
@e := SELECT a.key,c.value FROM @a INNER JOIN @c ON a.key=c.key;
@f := SELECT * FROM @d UNION SELECT * FROM @e UNION SELECT * FROM @a;
INSERT OVERWRITE TABLE dest SELECT * FROM @f;
@g := SELECT e.key,c.value FROM @e JOIN @c ON e.key=c.key;
INSERT OVERWRITE TABLE dest2 SELECT * FROM @g;
Desenvolvimento avançado de scripts
O modo de script do MaxCompute suporta instruções IF, que permitem ao programa selecionar automaticamente a lógica de execução com base em condições. A sintaxe IF no MaxCompute é categorizada pelo tipo de condição: expressões BOOLEAN e Subconsultas Escalares BOOLEAN.
-
A condição IF é uma expressão BOOLEAN
Este tipo de instrução IF ELSE determina qual ramificação executar durante o tempo de compilação. Exemplo:
--Data processing SET odps.sql.allow.fullscan=true; SET odps.optimizer.cbo.rule.filter.black=LM; @date := '${var}'; @row TABLE(key int,VALUE bigint); --Declare the variable row. Its type is Table and its schema is string. IF ( cast(@date AS bigint) % 2 == 0 ) BEGIN @row := SELECT key,VALUE FROM src1; END ELSE BEGIN @row := SELECT key,VALUE FROM src2; END INSERT OVERWRITE TABLE dest1 PARTITION(p='${var}') SELECT key,VALUE FROM @row;
NotaO código define uma variável chamada var. Atribua um valor à variável var nas configurações de parâmetros de agendamento.
-
A condição IF é uma Subconsulta Escalar BOOLEAN
Esse tipo de instrução IF ELSE não consegue determinar qual ramificação executar no momento da compilação; a definição ocorre em tempo de execução. Portanto, é necessário enviar vários jobs. Exemplo:
@i bigint; @t TABLE(id bigint, VALUE bigint); IF ((SELECT count(*) FROM src WHERE a = '5') > 1) BEGIN @i := 1; @t := SELECT @i, @i*2; END ELSE BEGIN @i := 2; @t := SELECT @i, @i*2; END SELECT id, VALUE FROM @t; -
Desenvolvimento de UDF incorporada
Também é possível incorporar código Java ou Python em scripts SQL para desenvolver UDFs incorporadas no modo de script do MaxCompute. Para obter mais informações, consulte UDF incorporada.
Depurar um nó MaxCompute Script
-
Configure os parâmetros relevantes em Run Configuration, no lado direito da página de edição do nó.
Parâmetro
Descrição
Compute resource
Selecione o recurso de computação MaxCompute associado.
Compute quota
Escolha uma cota de computação criada para fornecer os recursos de computação (CPU e memória) necessários aos seus jobs.
Caso não haja cota disponível, clique em Create Compute Quota na lista suspensa e crie uma cota de computação no console do MaxCompute.
Resource group
Selecione um grupo de recursos de agendamento aprovado no teste de conectividade com o recurso de computação. Para mais detalhes, consulte Conectividade de rede.
Selecione a fonte de dados MaxCompute criada na caixa de diálogo de parâmetros da barra de ferramentas e clique em Run para executar a tarefa MaxCompute Script.
Próximas etapas
Configurar definições de agendamento: Para que o nó no diretório do projeto seja agendado periodicamente, configure a Scheduling Policy e as propriedades relacionadas em Scheduling Settings, à direita do nó.
Implantar um nó: Para implantar a tarefa no ambiente de produção, clique no ícone
para iniciar o processo de implantação. Os nós no diretório do projeto são agendados periodicamente apenas após a implantação no ambiente de produção.
Instruções de criação de tabela e dados de amostra
Exemplo:
--Create tables CREATE TABLE IF NOT EXISTS src(key string ,VALUE BIGINT); INSERT INTO src VALUES ('1',11) ; INSERT INTO src VALUES ('1',11) ; CREATE TABLE IF NOT EXISTS src2(key string ,VALUE BIGINT); INSERT INTO src2 VALUES ('1',22); INSERT INTO src2 VALUES ('2',22); CREATE TABLE IF NOT EXISTS src3(key string ,VALUE BIGINT); INSERT INTO src3 VALUES ('1',33); INSERT INTO src3 VALUES ('3',33);