Apache Arrow DataFusion 数据源使用指南
概述
Apache Arrow DataFusion 是一个高性能的查询引擎,支持多种数据源格式和存储系统。本文将详细介绍如何在 DataFusion CLI 中使用本地文件、远程文件以及各种云存储服务作为数据源。
本地文件查询
DataFusion 可以直接查询本地文件系统中的文件,支持 CSV、Parquet、Avro、JSON 等多种格式。
单文件查询
- 首先创建一个示例 CSV 文件:
echo "a,b" > data.csv
echo "1,2" >> data.csv
- 在 DataFusion CLI 中查询该文件:
> select * from 'data.csv';
+---+---+
| a | b |
+---+---+
| 1 | 2 |
+---+---+
目录查询
DataFusion 可以查询整个目录下的文件,前提是这些文件具有兼容的 schema:
# 假设目录结构如下
ls data_dir/
data.csv data2.csv
> select * from 'data_dir';
+---+---+
| a | b |
+---+---+
| 3 | 4 |
| 1 | 2 |
+---+---+
远程文件查询
DataFusion 支持直接查询远程存储的文件,无需预先注册为表。
HTTP(S) 文件
select count(*) from 'https://example.com/data/hits_1.parquet'
+----------+
| COUNT(*) |
+----------+
| 1000000 |
+----------+
云存储服务
AWS S3
select count(*) from 's3://my-data-bucket/athena_partitioned/hits.parquet'
需要设置环境变量:
- AWS_ACCESS_KEY_ID
- AWS_SECRET_ACCESS_KEY
- AWS_DEFAULT_REGION
Google Cloud Storage (GCS)
select count(*) from 'gs://bucket/path/file.parquet'
需要设置环境变量:
- GOOGLE_SERVICE_ACCOUNT
创建外部表
除了直接查询文件,还可以创建持久化的外部表。
基本语法
CREATE EXTERNAL TABLE table_name
STORED AS FORMAT
LOCATION 'path_or_url'
[OPTIONS (key 'value')]
示例
- 本地 Parquet 文件:
CREATE EXTERNAL TABLE hits
STORED AS PARQUET
LOCATION 'hits.parquet';
- 远程 HTTP 文件:
CREATE EXTERNAL TABLE hits
STORED AS PARQUET
LOCATION 'https://example.com/data/hits_1.parquet';
数据格式支持
Parquet 格式
Parquet 文件的 schema 会自动推断。
-- 单文件
CREATE EXTERNAL TABLE taxi
STORED AS PARQUET
LOCATION '/mnt/nyctaxi/tripdata.parquet';
-- 目录
CREATE EXTERNAL TABLE taxi
STORED AS PARQUET
LOCATION '/mnt/nyctaxi/';
-- 通配符
CREATE EXTERNAL TABLE taxi
STORED AS PARQUET
LOCATION '/mnt/nyctaxi/*.parquet';
CSV 格式
CSV 文件支持自动推断 schema 或显式定义 schema。
-- 自动推断(带表头)
CREATE EXTERNAL TABLE test
STORED AS CSV
LOCATION '/path/to/file.csv'
OPTIONS ('has_header' 'true');
-- 显式定义 schema
CREATE EXTERNAL TABLE test (
c1 VARCHAR NOT NULL,
c2 INT NOT NULL
)
STORED AS CSV
LOCATION '/path/to/file.csv';
云存储配置
AWS S3 详细配置
CREATE EXTERNAL TABLE test
STORED AS PARQUET
OPTIONS(
'aws.access_key_id' '******',
'aws.secret_access_key' '******',
'aws.region' 'us-east-2'
)
LOCATION 's3://bucket/path/file.parquet';
阿里云 OSS
CREATE EXTERNAL TABLE test
STORED AS PARQUET
OPTIONS(
'aws.access_key_id' '******',
'aws.secret_access_key' '******',
'aws.oss.endpoint' 'https://bucket.oss-cn-hangzhou.aliyuncs.com'
)
LOCATION 'oss://bucket/path/file.parquet';
腾讯云 COS
CREATE EXTERNAL TABLE test
STORED AS PARQUET
OPTIONS(
'aws.access_key_id' '******',
'aws.secret_access_key' '******',
'aws.cos.endpoint' 'https://cos.ap-singapore.myqcloud.com'
)
LOCATION 'cos://bucket/path/file.parquet';
最佳实践
- 性能考虑:对于大型数据集,优先使用 Parquet 格式而非 CSV
- 安全建议:避免在 SQL 中硬编码凭证,使用环境变量更安全
- schema 管理:对于生产环境,建议显式定义 schema 而非依赖自动推断
- 错误处理:查询远程文件时添加适当的超时和重试机制
通过本文介绍的各种方法,您可以灵活地在 DataFusion 中使用各种数据源,从本地文件到云存储服务,满足不同的数据处理需求。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考