O nó SQL do MaxCompute no DataWorks agenda periodicamente tarefas SQL do MaxCompute e se integra a outros tipos de nó em um fluxo de trabalho unificado. O SQL do MaxCompute utiliza uma sintaxe semelhante à SQL, adequada para o processamento distribuído de dados em grande escala (nível de TB) nos quais resultados em tempo real não são críticos.
Introdução
O SQL do MaxCompute processa e consulta dados no MaxCompute. Ele oferece suporte a operações SQL comuns, como SELECT, INSERT, UPDATE e DELETE, além de sintaxe e funções específicas do MaxCompute. Para obter mais informações sobre a sintaxe SQL, consulte SQL overview.
Pré-requisitos
Você possui bound a MaxCompute compute engine ao workspace do DataWorks.
-
(Opcional, para usuários RAM) O usuário RAM responsável pelo desenvolvimento da tarefa deve ser membro do workspace e ter a função Development ou Workspace Administrator. A função Workspace Administrator inclui permissões amplas e deve ser concedida com cautela. Para obter mais informações sobre como adicionar um membro a um workspace, consulte Add members to a workspace.
NotaSe você estiver usando uma conta Alibaba Cloud, poderá pular esta etapa.
Limitações
As seguintes limitações se aplicam ao desenvolvimento SQL no nó SQL do MaxCompute:
|
Categoria |
Descrição |
|
Comentários |
Apenas comentários de linha única que começam com Para obter mais informações, consulte MaxCompute SQL comments. As seguintes limitações também se aplicam aos comentários:
|
|
Envio de SQL |
O ODPS SQL não suporta instruções SET ou USE isoladas. Elas devem ser executadas juntamente com uma instrução SQL específica. |
|
Desenvolvimento SQL |
O tamanho do código SQL não pode exceder128 KB, e o número de instruções SQL não pode ultrapassar200. |
|
Resultados de consulta |
Apenas instruções SQL que começam com SELECT ou WITH podem gerar conjuntos de resultados formatados. Os resultados de consulta possuem as seguintes limitações:
Nota
Se você encontrar limitações nos resultados de consulta, poderá baixar os resultados para sua máquina local utilizando os seguintes métodos:
|
Observações
Certifique-se de que a conta usada para executar tarefas SQL do MaxCompute tenha as permissões necessárias no projeto correspondente do MaxCompute. Para obter mais informações, consulte DataWorks On MaxCompute permission control e MaxCompute authorization.
A execução de tarefas SQL do MaxCompute depende de recursos de cota. Se sua tarefa demorar muito para ser executada, acesse o console do MaxCompute para verificar o consumo de recursos de cota e garantir que haja recursos suficientes disponíveis para a execução. Para obter mais informações, consulte View quota resource consumption.
Ao desenvolver tarefas de nó SQL do MaxCompute, parâmetros especiais, como caminhos do OSS, devem estar entre aspas duplas. A ausência de aspas pode causar exceções de análise da tarefa, resultando em falhas na execução.
Ao executar instruções relacionadas a palavras-chave (SET, USE) em diferentes ambientes no DataWorks, a ordem de execução varia. Para obter mais informações, consulte Appendix 1: SQL execution order in different environments.
Em alguns casos extremos, como falta de energia no servidor ou failover primário/secundário, o DataWorks pode não conseguir encerrar completamente as tarefas relacionadas do MaxCompute. Nessa situação, acesse o projeto correspondente do MaxCompute para terminate the job.
Quando o objetivo principal de uma tarefa é criar uma nova tabela (por exemplo,
DROP TABLEseguido porCREATE TABLE AS SELECT), o mecanismo do MaxCompute realiza uma verificação prévia de metadados antes da execução. Se a tabela já existir, um erro é retornado diretamente. Para a criação inicial da tabela, useCREATE TABLE IF NOT EXISTS. Para gravações subsequentes de dados, utilizeINSERT OVERWRITE TABLE ... SELECT ....-
É possível controlar o modo de execução SQL definindo o parâmetro
odps.task.sql.realtime. Defina o valor comotruepara ativar o modo Online para execução em tempo real, ou defina o valor comofalsepara forçar o modo Offline. Coloque este parâmetro no início do seu código SQL, antes das instruções SQL de negócio. Exemplo:SET odps.task.sql.realtime=true; -- Your business SQL statements SELECT * FROM my_table;
A modificação direta de um tipo de dados de coluna de STRING para tipos complexos, como STRUCT, não é suportada. Se o erro
ODPS-0130071for retornado, verifique se a conversão de tipo de campo está em conformidade com as regras semânticas e evite operações de conversão de tipo não suportadas.
Criar um nó SQL do MaxCompute
Para obter informações sobre como criar um nó, consulte Create a MaxCompute SQL node.
Desenvolver um nó SQL do MaxCompute
Na página de edição do nó SQL do MaxCompute, realize as seguintes operações.
Desenvolver código SQL
O DataWorks fornece parâmetros de agendamento para passar valores dinamicamente ao código em cenários de agendamento. Você pode definir variáveis em um nó SQL do MaxCompute usando o formato ${variable_name} e, em seguida, atribuir valores às variáveis na seção Scheduling Parameters das Scheduling Settings. Para obter mais informações sobre os formatos suportados, consulte Scheduling parameters. O SQL do MaxCompute usa uma sintaxe semelhante à SQL padrão e suporta instruções DDL, DML e DQL, além de sintaxe específica do MaxCompute. Para sintaxe detalhada e exemplos, consulte SQL overview.
Os três exemplos a seguir são fornecidos para diferentes cenários:
Quando as funções estendidas do MaxCompute 2.0 utilizam novos tipos de dados, você deve adicionar
SET odps.sql.type.system.odps2=true;antes da instrução SQL que contém a função, além de enviá-la e executá-la junto com a instrução SQL para que os novos tipos de dados funcionem corretamente. Para obter mais informações sobre os tipos de dados 2.0, consulte MaxCompute 2.0 data types.As instruções SQL do MaxCompute são executadas em uma ordem diferente nos ambientes Data Studio e Operation Center. Para obter mais informações, consulte Appendix 1: SQL execution order in different environments.
Criar uma tabela
Utilize a instrução CREATE TABLE para criar tabelas não particionadas, tabelas particionadas, tabelas externas e tabelas clusterizadas. Para obter mais informações, consulte CREATE TABLE. O seguinte exemplo de SQL é fornecido:
-- Create a partitioned table named students CREATE TABLE IF NOT EXISTS students ( id BIGINT, name STRING, age BIGINT, birth DATE) partitioned BY (gender STRING);
Inserir dados
Use a instrução INSERT INTO ou INSERT OVERWRITE para inserir ou atualizar dados em uma tabela de destino. Para obter mais informações, consulte Insert or overwrite data.
Evite usar a instruçãoINSERT INTOpara inserir dados, pois isso pode causar duplicação inesperada de dados. Recomendamos o uso deINSERT OVERWRITE. Para obter mais informações, consulte Insert or overwrite data .
O seguinte exemplo de SQL é fornecido:
-- Insert data INSERT OVERWRITE students PARTITION(gender='boy') VALUES (1,'ZhangSan',15,DATE '2008-05-15') ;
A instrução INSERT pode acionar o recurso Compare DDL Columns, que permite comparar as colunas na cláusula SELECT de uma instrução SQL com as colunas da tabela de destino.
Este recurso não é suportado quando o projeto MaxCompute tem o modelo de três camadas baseado em esquema ativado no nível do projeto, mas não no nível do locatário.
-- Compare DDL columns INSERT OVERWRITE TABLE dws_user_info_all_di PARTITION (dt='${workflow.var}') SELECT COALESCE(a.uid, b.uid) AS uid , b.gender , b.age_range , b.zodiac , a.region , a.device , a.identity , a.method , a.url , a.referer , a.time -- ...The FROM/JOIN and other clauses are omitted here. Complete them based on your actual business requirements. ;
Consultar dados
Utilize a instrução SELECT para realizar consultas aninhadas, consultas agrupadas, ordenação e outras operações. Para obter mais informações, consulte SELECT syntax. O seguinte exemplo de SQL é fornecido:
-- (Optional) Enable full table scan at the project level. This operation requires elevated permissions. -- SETPROJECT odps.sql.allow.fullscan=true; -- Enable full table scan at the session level. This setting is effective only for the current session. SET odps.sql.allow.fullscan=true; -- Query information about all male students and sort the results by ID in ascending order. SELECT * FROM students WHERE gender='boy' ORDER BY id;
Por padrão, os usuários RAM não têm permissão para consultar tabelas de produção. Para solicitar permissões de consulta de tabelas de produção, acesse o Security Center. Para obter mais informações sobre predefinições de permissão de dados do MaxCompute e controle de acesso a dados no DataWorks, consulte MaxCompute data permission presets and access control. Para obter mais informações sobre autorização baseada em comandos do MaxCompute, consulte MaxCompute authorization.
Usar funções SQL
O MaxCompute suporta funções integradas e funções definidas pelo usuário (UDFs). Você pode criar e usar funções SQL conforme suas necessidades de negócio. Para obter mais informações sobre funções integradas, consulte Built-in functions overview. Para obter mais informações sobre UDFs, consulte UDF overview. Os exemplos a seguir mostram como usar funções SQL.
-
Funções integradas: As funções integradas são pré-instaladas no MaxCompute e podem ser chamadas diretamente. Com base nos exemplos anteriores de criação de tabela, inserção de dados e consulta de dados, você pode usar a função
dateaddpara modificar a coluna birth por uma unidade e deslocamento especificados. O seguinte exemplo de comando é fornecido:--Enable full table scan at session level. Only effective for this session. SET odps.sql.allow.fullscan=true; SELECT id, name, age, birth, dateadd(birth,1,'mm') AS birth_dateadd FROM students; Funções definidas pelo usuário (UDFs): Para usar uma UDF, você deve escrever o código da função, fazer upload dele como source e registrar a função. Para obter mais informações, consulte Create a MaxCompute UDF.
Depurar um nó SQL do MaxCompute
-
Configure os parâmetros relevantes no painel 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 do MaxCompute que você associou ao workspace.
Compute quota
Selecione a cota de computação para fornecer os recursos de computação necessários (CPU e memória) para jobs de computação.
Se nenhuma cota de computação estiver disponível, clique em Create Compute Quota na lista suspensa e crie uma cota no console do MaxCompute. Para obter mais informações, consulte Create a compute quota.
Resource group
Selecione um grupo de recursos de agendamento que tenha passado no teste de conectividade com o recurso de computação. Para obter mais informações, consulte Resource groups for scheduling.
Na caixa de diálogo de parâmetros na barra de ferramentas, selecione a fonte de dados do MaxCompute que você criou e, em seguida, clique em Run para executar a tarefa SQL do MaxCompute.
Executar um nó diretamente no DataStudio corresponde ao modo de depuração. Nesse modo, o nó valida apenas a lógica SQL e não depende da configuração de agendamento. Se você precisar executar o nó em um fluxo de trabalho (modo de agendamento), deverá concluir as seguintes configurações antes que o fluxo de trabalho possa executar o nó:
Na configuração de execução, selecione o Compute resource necessário.
Configure as propriedades de Scheduling do nó.
Faça o Deploy do nó para o ambiente de produção.
Os nós For-each não suportam execução direta no DataStudio. Você deve primeiro implantar a tarefa e depois testá-la usando o recurso Smoke Test no Operation Center.
Visualizar resultados
-
Os resultados são exibidos em formato de planilha. Você pode realizar operações no DataWorks, abrir os resultados em uma planilha ou copiar e colar o conteúdo em um arquivo Excel local.
NotaDevido a alterações nas informações de fuso horário da china divulgadas pela Organização Internacional para Padronização (ISO), podem ocorrer discrepâncias na exibição de datas para determinados períodos ao executar instruções SQL relacionadas por meio do DataWorks: uma diferença de 5 minutos e 52 segundos para datas entre 1900 e 1928, e uma diferença de 9 segundos para datas anteriores a 1900.
Log de execução: Na aba
dos resultados, clique em Logview para visualizar os logs. Para obter mais informações, consulte LogView.Ordenar resultados: Na página de resultados, clique em menu suspenso no cabeçalho da coluna correspondente, selecione a ordem crescente ou decrescente na seção Sort e, em seguida, confirme para ordenar os resultados.
Visualizar colunas BLOB: O MaxCompute suporta o tipo de dados BLOB para armazenar objetos binários, como imagens e arquivos de áudio. Nos resultados, clique em duas vezes em uma célula desse tipo de dados para visualizar o conteúdo na caixa de diálogo Current Field Value (imagens são renderizadas diretamente; texto é exibido em modo somente leitura). Você pode alternar entre Blob View, Text View e JSON View usando os botões na parte inferior da caixa de diálogo.
Exibição em notação científica: No ambiente de desenvolvimento de dados do DataWorks, valores numéricos nos resultados de consulta podem ser exibidos em notação científica. Trata-se de uma questão de exibição do frontend e não afeta os valores reais dos dados. Para garantir que os valores numéricos sejam exibidos conforme esperado, use a função
CASTem seu SQL para converter manualmente o tipo de dados. Por exemplo, useCAST(column_name AS STRING)para converter um valor numérico em string para exibição. Você também pode verificar a precisão dos dados no módulo DataAnalysis.
Próximas etapas
Configure schedule settings: Se os nós no diretório do projeto precisarem ser agendados periodicamente, configure a Scheduling Policy e as propriedades de agendamento relacionadas no painel Scheduling Settings no lado direito do nó.
Deploy a node: Se uma tarefa precisar ser implantada no ambiente de produção, clique em ícone
na página para iniciar o processo de implantação. Os nós no diretório do projeto são agendados periodicamente somente após serem implantados no ambiente de produção.
Apêndice 1: Ordem de execução SQL em diferentes ambientes
Ao executar instruções relacionadas a palavras-chave (SET, USE) em diferentes ambientes do DataWorks para um nó SQL do MaxCompute, a ordem de execução varia.
Execução no Data Studio: Todas as instruções de palavra-chave (SET, USE) no código da tarefa atual são mescladas e prefixadas a todas as instruções SQL.
Execução no ambiente de agendamento: As instruções são executadas na ordem em que foram escritas.
Suponha que o seguinte código esteja definido em um nó.
SET a=b;
CREATE TABLE name1(id string);
SET c=d;
CREATE TABLE name2(id string);
A ordem de execução varia por ambiente da seguinte forma:
|
Instrução SQL |
Data Studio |
Ambiente de agendamento |
|
Primeira instrução SQL |
|
|
|
Segunda instrução SQL |
|
|
Apêndice 2: Práticas de Lakehouse
Para ler e gravar em tabelas de dados DLF em tarefas SQL do MaxCompute, utilize projetos externos do MaxCompute (External Project). Projetos externos permitem acesso em tempo real a metadados e dados mapeando catálogos DLF. Eles delegam o gerenciamento de permissões ao DLF e suportam acesso a metadados e operações de leitura/gravação em dados gerenciados pelo DLF armazenados no OSS. Para obter mais informações, consulte MaxCompute external projects.
FAQ
Por que um nó SQL do MaxCompute é executado com sucesso diretamente no DataStudio, mas falha ao executar em um fluxo de trabalho?
Executar um nó diretamente no DataStudio corresponde ao modo de depuração, que valida apenas a lógica SQL e não depende da configuração de agendamento. Para executar um nó em um fluxo de trabalho (modo de agendamento), você deve garantir que as seguintes condições sejam atendidas:
Na configuração de execução, selecione o Compute resource necessário.
Configure as propriedades de Scheduling do nó.
Faça o Deploy do nó para o ambiente de produção.
Após a conclusão dessas configurações, o nó SQL do MaxCompute será executado normalmente no fluxo de trabalho.
O que devo fazer se o MERGE INTO demorar muito ou tiver desempenho inferior ao INSERT OVERWRITE?
Análise da causa
A instrução MERGE INTO requer uma leitura completa da tabela alvo e um JOIN completo para determinar o status de cada linha (se deve inserir, atualizar ou excluir). Em comparação com o INSERT OVERWRITE, essa abordagem introduz uma sobrecarga significativa de Shuffle, mesmo quando ambas as operações envolvem varreduras completas de tabela.
Soluções de otimização
Reduza a simultaneidade do Mapper aumentando o tamanho do split para minimizar a contenção de recursos.
Particione a tabela alvo e use pruning de partição para varrer apenas as partições afetadas.
Reescreva a operação MERGE INTO como um INSERT OVERWRITE em duas etapas que utilize partições dinâmicas para regravar apenas as partições afetadas.
Use INSERT OVERWRITE com uma dica MapJoin para substituir o MERGE INTO. Isso permite que o Mapper carregue uma parte dos dados da tabela alvo na memória para correspondência, reduzindo a sobrecarga de Shuffle.
Cenários aplicáveis
Embora o MERGE INTO possa reduzir o tempo de computação em cenários de atualização de tabelas transacionais ao consolidar operações de inserção e exclusão, e atualmente não seja cobrado separadamente, tenha cautela ao avaliar o desempenho do MERGE INTO em cenários de varredura completa de tabela em grande escala.
Os resultados da consulta estão normais, mas os dados ficam anormais após o INSERT. Os valores dos campos tornam-se 0 ou NULL. Como solucionar isso?
Realize as seguintes verificações:
Verifique se dados duplicados em sua lógica SQL fazem com que funções de janela, como
ROW_NUMBER, retornem resultados instáveis. Recomendamos deduplicar os dados antes de aplicarORDER BY.Confirme se o escopo de dados das operações de consulta e gravação é exatamente o mesmo, incluindo intervalos de tempo e condições WHERE. Diferenças nas condições de filtro podem causar discrepâncias nos resultados.
Se suspeitar de problemas de estabilidade de dados, crie uma tabela temporária e grave nela os dados intermediários filtrados pela condição WHERE. Verifique a precisão dos dados na tabela temporária antes de realizar a operação final de gravação.
Como otimizar o armazenamento ao usar SQL para limpar logs do SLS, o que causa o armazenamento duplo dos dados?
Aplique as seguintes otimizações:
Defina um ciclo de vida curto (como 3 dias) para a tabela intermediária que armazena Raw Logs, evitando o consumo de armazenamento a longo prazo.
Após a conclusão da análise dos dados, exclua prontamente os dados da partição na tabela intermediária para liberar recursos de armazenamento.
Referências
Para obter mais exemplos de tarefas SQL do MaxCompute, consulte os seguintes tópicos: