Consultando dados de data lakes

Antes de Iniciar

Nos exemplos, utiliza-se o conjunto de dados “ Viagem de táxi em Nova York registrar dados ” sobre táxis amarelos, disponível publicamente, referente a janeiro de 2022. Para seguir este exemplo, certifique-se de que os dados estejam em um bucket do S3 acessível.

Para acessar os arquivos d S3, é necessário ter uma conta no AWS com as permissões adequadas para fornecer seu ID de chave de acesso e sua chave secreta de acesso.

AWS S3 exemplo

1. Criar uma origem de dados externa

As origens de dados externas permitem que um administrador conceda acesso ao S3 sem fornecer as chaves diretamente para um usuário

Criação de fonte de dados:

a) Configure ENABLE_EXTERNAL_DATASOURCE

set ENABLE_EXTERNAL_DATASOURCE = 1;

b) Criar uma origem de dados externa

create EXTERNAL DATASOURCE 'DATA SOURCE' on 'REMOTE SOURCE'
using (
    ACCESSKEYID 'ACCESS KEY ID' SECRETACCESSKEY 'SECRET ACCESS KEY' BUCKET 'BUCKET' REGION 'REGION'
);

Exemplo:

create EXTERNAL DATASOURCE AWS_TAXI_DATASET on AWSS3 
using (
     ACCESSKEYID '...' SECRETACCESSKEY '...' BUCKET 'nyc-tlc' REGION 'us-east-1'
);

Para obter mais informações, consulte Comando CREATE EXTERNAL DATASOURCE

2. Criar uma tabela externa.

Depois de criar uma origem de dados externa, é possível criar uma tabela externa que acesse os dados de táxi amarelo de janeiro de 2022.

Assegure-se de ter os privilégios necessários, conforme descrito em Privilégios para criar tabelas externas.

create EXTERNAL TABLE 'TABLE NAME' on 'DATA SOURCE'
using ( 
    DATAOBJECT ('DATA OBJECT') FORMAT 'PARQUET' 
);

O argumento DATAOBJECT deve fazer referência a um único arquivo no formato parquet.. Se quiser consultar vários arquivos " parquet, você deverá criar mais tabelas externas.

Exemplo:

create EXTERNAL TABLE YELLOW_TAXI_JANUARY_2022 on AWS_TAXI_DATASET 
using ( 
    DATAOBJECT ('/trip data/yellow_tripdata_2022-01.parquet') FORMAT 'PARQUET' 
);

3. Consulte seus dados.

Você pode consultar tabelas externas no formato parquet como qualquer outra tabela NPSaaS sem precisar carregar os dados no banco de dados.

Os nomes das colunas do parquet não diferenciam maiúsculas de minúsculas, a menos que isso introduza uma colisão nos nomes das colunas.

  • Para identificar o número total de passageiros que viajaram de táxi em Nova York em janeiro de 2022, execute:
select sum(passenger_count) from YELLOW_TAXI_JANUARY_2022;

Saída:

SUM
-----
3324167
(1 row)
  • Para identificar o fornecedor que tinha o maior número de passageiros entre 1h e 6h, execute:
```sql {: codeblock}
select
    VendorID,
    sum("passenger_count") as passengers
from
    YELLOW_TAXI_JANUARY_2022
where
    tpep_pickup_datetime::time > '1:00am'
    and tpep_pickup_datetime::time < '6:00am'
group by
    VendorID
order by
    passengers desc;
```
Saída:

```sql {: codeblock}
VendorID| passengers
--------|----------
2       | 122251
1       | 40807
6       |
5       |
(4 rows)
```

Você não precisa carregar tabelas inteiras no NPSaaS. *O Parquet* é um formato colunar, de modo que o mecanismo NPSaaS pode consultar um subconjunto de colunas sem precisar transferir a tabela inteira pela internet. Dessa forma, se você trabalhar com tabelas grandes, será possível reduzir significativamente o tráfego de ingresso e atingir tempos de carga mais rápidos O mecanismo de consulta sempre usa apenas as colunas de uma tabela *parquet* necessárias.
{: tip}

Solução de problemas relacionados a erros de tempo limite do AWS

Se você encontrar o seguinte erro durante consultas no Lakehouse:

AWS Error NETWORK_CONNECTION during HeadObject operation: curlCode: 28, Timeout was reached

Você pode resolver esse problema definindo os seguintes valores de configuração:

set dlAWSConnectTimeout=10;
set dlAWSRetryStrategy=1;
set dlAWSNumRetries=10;

Essas configurações ajustam o tempo limite de conexão do AWS, a estratégia de tentativas e o número de tentativas para lidar com problemas de conectividade de rede de maneira mais eficaz.

Exemplo de BLOB Azure

Defina ENABLE_AZURE_DATALAKE_SUPPORT.

set ENABLE_AZURE_DATALAKE_SUPPORT = true;

1. Criar uma origem de dados externa

  create EXTERNAL DATASOURCE 'DATA SOURCE' on 'REMOTE SOURCE'
  using (
       ACCOUNT 'ACCOUNT NAME' ACCOUNTKEY 'SECRET ACCESS KEY' CONTAINER 'CONTAINER NAME'
  );

ACCOUNTKEY pode ser omitido para acesso anônimo.

create EXTERNAL DATASOURCE AZURE_TAXI_DATASET on AZUREBLOB 
using (
     ACCOUNT 'azureopendatastorage' CONTAINER 'nyctlc'
);

Para obter mais informações, consulte Comando CREATE EXTERNAL DATASOURCE

2. Criar uma tabela externa.

Depois de criar uma fonte de dados externa, você pode criar uma tabela externa que acesse os dados de táxi verde de janeiro de 2018.

Assegure-se de ter os privilégios necessários, conforme descrito em Privilégios para criar tabelas externas.

Exemplo:

create EXTERNAL table GREEN_TAXI_JANUARY_2018 on AZURE_TAXI_DATASET
using (
    DATAOBJECT ('/green/puYear=2018/puMonth=1/part-00036-tid-4753095944193949832-fee7e113-666d-4114-9fcb-bcd3046479f3-2606-1.c000.snappy.parquet') FORMAT 'PARQUET'
);

3. Consulte seus dados.

Você pode consultar tabelas externas no formato parquet como qualquer outra tabela NPSaaS sem precisar carregar os dados no banco de dados.

Os nomes das colunas do parquet não diferenciam maiúsculas de minúsculas, a menos que isso introduza uma colisão nos nomes das colunas.

  • Para identificar o número total de passageiros que viajaram de táxi em Nova York em janeiro de 2018, execute:
select sum(passengercount) from GREEN_TAXI_JANUARY_2018;

Saída:

SUM
-----
1081283
(1 row)
  • Para identificar o fornecedor que tinha o maior número de passageiros entre 1h e 6h, execute:
```sql {: codeblock}
select
    VendorID,
    sum(passengercount) as passengers
from
    GREEN_TAXI_JANUARY_2018
where
    lpeppickupdatetime::time > '1:00am'
    and lpeppickupdatetime::time < '6:00am'
group by
    VendorID
order by
    passengers desc;
```
Saída:

```sql {: codeblock}
VendorID| passengers
--------|----------
2       | 122251
1       | 40807
6       |
5       |
(4 rows)
```