从数据湖查询数据

准备工作

在示例中,使用了2022年1月黄色出租车的公开数据集 纽约的出租车之旅 记录数据。 要按照此示例操作,请确保数据位于可访问的 S3 存储桶中。

要访问 S3 文件,您需要拥有一个具备相应权限的 AWS 账户,以便提供您的访问密钥ID和秘密访问密钥。

AWS S3 示例

1. 创建外部数据源。

外部数据源允许管理员在不直接向用户提供密钥的情况下授予对 S3 的访问权。

创建数据源:

a) 设置 ENABLE_EXTERNAL_DATASOURCE

set ENABLE_EXTERNAL_DATASOURCE = 1;

b) 创建外部数据源。

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

示例:

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

有关更多信息,请参阅 CREATE EXTERNAL DATASOURCE 命令

2. 创建外部表。

创建外部数据源后,可以创建从 2022 年 1 月开始访问黄色出租车数据的外部表。

确保您具有必要的特权,如 用于创建外部表的特权 中所述。

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

DATAOBJECT 自变量必须引用 parquet 格式的单个文件。 如果要从多个 "parquet 文件中进行查询,则必须创建更多外部表。

示例:

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

3. 查询数据。

您可以像查询其他NPSaaS表一样查询外部 parquet 格式表,而无需将数据加载到数据库中。

parquet列名不区分大小写,除非会导致列名冲突。

  • 要确定 2022 年 1 月在纽约乘坐出租车的乘客总数,请运行:
select sum(passenger_count) from YELLOW_TAXI_JANUARY_2022;

输出:

SUM
-----
3324167
(1 row)
  • 要确定在凌晨 1:00 到 6:00 之间乘客最多的供应商,请运行:
```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;
```
输出:

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

您无需将整个表加载到 NPSaaS 中。*Parquet* 是一种列式格式,因此 NPSaaS 引擎可以查询部分列,而无需通过互联网传输整个表。 这样,如果您使用大型表,那么可以显着减少入口流量并实现更快的装入时间。 查询引擎始终只使用 *parquet* 表中需要的列。
{: tip}

AWS 超时错误的故障排除

如果您在执行 Lakehouse 查询时遇到以下错误:

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

您可以通过设置以下配置值来解决此问题:

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

这些设置用于调整 AWS 的连接超时、重试策略和重试次数,以便更有效地处理网络连接问题。

AzureBLOB 示例

设置 ENABLE_AZURE_DATALAKE_SUPPORT

set ENABLE_AZURE_DATALAKE_SUPPORT = true;

1. 创建外部数据源。

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

如果是匿名访问,可以省略 ACCOUNTKEY。

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

有关更多信息,请参阅 CREATE EXTERNAL DATASOURCE 命令

2. 创建外部表。

创建外部数据源后,可以创建一个外部表,访问 2018 年 1 月的绿色出租车数据。

确保您具有必要的特权,如 用于创建外部表的特权 中所述。

示例:

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. 查询数据。

您可以像查询其他NPSaaS表一样查询外部 parquet 格式表,而无需将数据加载到数据库中。

parquet列名不区分大小写,除非会导致列名冲突。

  • 要确定 2018 年 1 月纽约乘坐出租车出行的乘客总数,请运行:
select sum(passengercount) from GREEN_TAXI_JANUARY_2018;

输出:

SUM
-----
1081283
(1 row)
  • 要确定在凌晨 1:00 到 6:00 之间乘客最多的供应商,请运行:
```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;
```
输出:

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