Query dei dati dai laghi di dati

Prima di iniziare

Negli esempi viene utilizzato il file “ Giro in taxi a New York registrare i dati ” relativo ai taxi gialli, disponibile al pubblico, relativo al mese di gennaio 2022. Per seguire questo esempio, assicurati che i dati si trovino in un bucket di S3 accessibile.

Per accedere ai file di S3, è necessario disporre di un account AWS con le autorizzazioni adeguate per fornire l'ID della chiave di accesso e la chiave di accesso segreta.

AWS S3 esempio

1. Creare un'origine dati esterna.

Le origini dati esterne consentono a un responsabile di concedere l'accesso a S3 senza fornire le chiavi direttamente a un utente.

Creazione dell'origine dati:

a) Impostare ENABLE_EXTERNAL_DATASOURCE.

set ENABLE_EXTERNAL_DATASOURCE = 1;

b) Creare una sorgente dati esterna.

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

Esempio:

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

Per ulteriori informazioni, consultare Comando CREATE EXTERNAL DATASOURCE.

2. Creare una tabella esterna.

Dopo aver creato un'origine dati esterna, è possibile creare una tabella esterna che accede ai dati dei taxi gialli a partire da gennaio 2022.

Accertarsi di disporre dei privilegi necessari come descritto in Privilegi per la creazione di tabelle esterne.

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

L'argomento DATAOBJECT deve fare riferimento a un singolo file nel formato parquet. Se si desidera interrogare più file 'parquet, è necessario creare più tabelle esterne.

Esempio:

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

3. interrogare i propri dati.

È possibile interrogare tabelle esterne in formato parquet come qualsiasi altra tabella NPSaaS senza dover caricare i dati nel database.

I nomi delle colonne del parquet sono insensibili alle maiuscole e minuscole, a meno che non si crei una collisione tra i nomi delle colonne.

  • Per identificare il numero totale di passeggeri che hanno viaggiato in taxi a New York nel gennaio 2022, eseguire:
select sum(passenger_count) from YELLOW_TAXI_JANUARY_2022;

Output:

SUM
-----
3324167
(1 row)
  • Per identificare il fornitore che ha avuto il maggior numero di passeggeri tra le 1:00 AM e le 6:00 AM, eseguire:
```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;
```
Output:

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

Non è necessario caricare intere tabelle su NPSaaS. *Parquet* è un formato colonnare, quindi il motore NPSaaS può eseguire query su un sottoinsieme di colonne senza dover trasferire l'intera tabella via Internet. In questo modo, se si lavora con tabelle di grandi dimensioni, è possibile ridurre in modo significativo il traffico in ingresso e ottenere tempi di caricamento più rapidi. Il motore query utilizza sempre solo le colonne da una tabella *parquet* necessarie.
{: tip}

Risoluzione dei problemi relativi agli errori di timeout di AWS

Se durante l'esecuzione di query su Lakehouse si verifica il seguente errore:

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

È possibile risolvere questo problema impostando i seguenti valori di configurazione:

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

Queste impostazioni consentono di regolare il timeout della connessione AWS, la strategia di riprova e il numero di tentativi, al fine di gestire in modo più efficace i problemi di connettività di rete.

Esempio di BLOB Azure

Impostare ENABLE_AZURE_DATALAKE_SUPPORT.

set ENABLE_AZURE_DATALAKE_SUPPORT = true;

1. Creare un'origine dati esterna.

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

ACCOUNTKEY può essere omesso per l'accesso anonimo.

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

Per ulteriori informazioni, consultare Comando CREATE EXTERNAL DATASOURCE.

2. Creare una tabella esterna.

Dopo aver creato un'origine dati esterna, è possibile creare una tabella esterna che acceda ai dati dei taxi verdi di gennaio 2018.

Accertarsi di disporre dei privilegi necessari come descritto in Privilegi per la creazione di tabelle esterne.

Esempio:

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. interrogare i propri dati.

È possibile interrogare tabelle esterne in formato parquet come qualsiasi altra tabella NPSaaS senza dover caricare i dati nel database.

I nomi delle colonne del parquet sono insensibili alle maiuscole e minuscole, a meno che non si crei una collisione tra i nomi delle colonne.

  • Per identificare il numero totale di passeggeri che hanno viaggiato in taxi a New York nel gennaio 2018, eseguire:
select sum(passengercount) from GREEN_TAXI_JANUARY_2018;

Output:

SUM
-----
1081283
(1 row)
  • Per identificare il fornitore che ha avuto il maggior numero di passeggeri tra le 1:00 AM e le 6:00 AM, eseguire:
```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;
```
Output:

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