Cenário
As empresas geralmente armazenam dados massivos, como de vários bancos de dados e armazéns, para gerenciamento e coleta de informações. No entanto, fontes de dados diversificadas, estruturas de conjuntos de dados híbridos e armazenamento de dados dispersos reduzem a eficiência da consulta.
O Spark de código aberto só suporta pushdown de filtro simples durante a consulta de dados de várias fontes. O desempenho do mecanismo SQL está deteriorado devido a uma grande quantidade de transmissão de dados desnecessária. A função pushdown é aprimorada para que aggregate, projection complexa e predicate complexa possam ser enviados para fontes de dados, reduzindo a transmissão de dados desnecessária e melhorando o desempenho da consulta.
Somente a origem de dados JDBC suporta pushdown de operações de consulta, como aggregate, projection, predicate, aggregate over inner join e aggregate over union all. Todas as operações de pushdown podem ser ativadas com base em suas necessidades.
Tabela 1 Consulta aprimorada de consulta entre fontes
Módulo |
Antes do aprimoramento |
Após o aprimoramento |
aggregate |
O pushdown da aggregate não é suportado. |
- O cálculo de funções de agregação é suportado. Exemplo: selecione avg(a) + max(b) da tabela
- O pushdown de algumas funções é suportado.
Pushdown de linhas em matemática, tempo e funções de string, como abs(), month() e length() são suportados. Além das funções internas anteriores, você pode executar o comando SET para adicionar funções suportadas pelas fontes de dados.
Exemplo: selecione sum(abs(a)) da tabela
|
projection |
Apenas pushdown de projection simples é suportado. Exemplo: selecione a, b da tabela |
- Expressões complexas podem ser empurradas para baixo.
Exemplo: selecione (a+b)*c da tabela
- Algumas funções podem ser empurradas para baixo. Para obter detalhes, consulte a descrição abaixo da tabela.
Exemplo: selecione length(a)+abs(b) da tabela
- Pushdown do limit e order by após a projection é suportada.
Exemplo: selecione a, b+c da tabela order by um limit 3
|
predicate |
Somente a filtragem simples com o nome da coluna à esquerda do operador e os valores à direita é suportada. Exemplo:
selecione * da tabela em que a>0 ou b em ("aaa", "bbb") |
- O pushdown de expressões complexas é suportado.
Exemplo: selecione * da tabela em que a+b>c*d ou a/c in (1, 2, 3)
- Algumas funções podem ser empurradas para baixo. Para obter detalhes, consulte a descrição abaixo da tabela.
Exemplo: selecione * da tabela onde length(a)>5
|
aggregate over inner join |
Os dados relacionados das duas tabelas devem ser carregados no Spark. A operação de junção deve ser executada antes da operação aggregate. |
Há suporte para as seguintes funções:
- Funções de agregação incluindo sum, avg, max, min e count são suportadas.
- Todas as operações aggregate podem ser realizadas em uma mesma tabela. As operações group by podem ser executadas em uma ou duas tabelas e somente a junção interna é suportada.
Os seguintes cenários não são suportados:
- aggregate não pode ser empurrado para baixo a partir das tabelas de junção esquerda e direita.
- aggregate contém operações, por exemplo, sum(a+b).
- Operações aggregate, por exemplo, sum(a)+min(b).
|
aggregate over union all |
Os dados relacionados das duas tabelas devem ser carregados no Spark. union deve ser realizada antes de aggregate. |
Cenários suportados:
funções de agregação incluindo sum, avg, max, min e count são suportadas.
Cenários não suportados:
- aggregate contém operações, por exemplo, sum(a+b).
- Operações aggregate, por exemplo, sum(a)+min(b).
|
Precauções
- Se a fonte de dados externa for Hive, a operação de consulta não poderá ser executada em tabelas externas criadas pelo Spark.
- Somente fontes de dados MySQL e MPPDB são suportadas.