从数据湖查询数据
准备工作
在示例中,使用了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)
```