### 基础操作
#### 1. 加载 Parquet 文件数据
DuckDB 支持直接从 Parquet 文件读取数据,将文件内容作为表来查询,无需提前导入数据。
```sql
-- 从 Parquet 文件读取数据
SELECT * FROM read_parquet('data/users.parquet');
```
#### 2. 创建基于 Parquet 文件的持久化表
若需将 Parquet 文件内容保存到 DuckDB 的持久化表中,可以使用 `CREATE TABLE AS`。
```sql
CREATE TABLE users AS SELECT * FROM read_parquet('data/users.parquet');
```
#### 3. 查询多个 Parquet 文件
DuckDB 支持对多个 Parquet 文件批量操作,适合处理大量数据的场景。
```sql
SELECT * FROM read_parquet('data/*.parquet'); -- 读取目录中的所有 Parquet 文件
```
#### 4. 筛选和聚合操作
直接在 Parquet 文件中进行筛选和聚合操作,无需导入数据库中。
```sql
SELECT name, age FROM read_parquet('data/users.parquet') WHERE age > 25;
SELECT AVG(age) FROM read_parquet('data/users.parquet');
```
#### 5. 导出数据为 Parquet 文件
DuckDB 支持将查询结果导出为 Parquet 文件,便于与其他系统交互。
```sql
COPY (SELECT * FROM users WHERE age > 25) TO 'output/filtered_users.parquet' (FORMAT PARQUET);
```
#### 6. 转换 CSV 数据到 Parquet
通过 DuckDB 将 CSV 数据转换为 Parquet 格式。
```sql
CREATE TABLE users_csv AS SELECT * FROM read_csv_auto('data/users.csv');
COPY users_csv TO 'output/users.parquet' (FORMAT PARQUET);
```
#### 7. 使用 Parquet 文件进行 JOIN 操作
可以在多个 Parquet 文件间直接进行 JOIN 操作,便于整合不同数据源。
```sql
SELECT u.name, o.order_id FROM read_parquet('data/users.parquet') AS u
JOIN read_parquet('data/orders.parquet') AS o ON u.user_id = o.user_id;
```
#### 8. 显示 Parquet 文件元数据
查看 Parquet 文件的元数据以获取列类型和统计信息等。
```sql
PRAGMA show_parquet_metadata('data/users.parquet');
```
高阶操作
1. 并行读取和优化查询性能
DuckDB 默认支持并行读取 Parquet 文件,且提供了优化查询的选项。
SET threads TO 4; -- 设置为 4 个并行线程
SET enable_object_cache TO TRUE; -- 启用缓存,减少重复 IO
2. 读取部分列(列裁剪)
仅读取所需列,减少数据量提升查询效率。
SELECT name, age FROM read_parquet('data/users.parquet');
3. 过滤谓词下推
将筛选条件下推至存储层执行,从而减少数据读取量。
SELECT * FROM read_parquet('data/large_data.parquet') WHERE age > 30;
4. 使用嵌套和复杂数据类型
DuckDB 支持嵌套和复杂数据类型,直接对嵌套字段操作。
SELECT id, address.city, address.zipcode FROM read_parquet('data/nested_data.parquet');
5. 分区表读取
可读取分区 Parquet 表的特定分区,减少非必要数据的读取量。
SELECT * FROM read_parquet('data/partitioned_data/date=2022-01-01/*.parquet');
6. 合并多个 Parquet 文件
将多个 Parquet 文件合并为一个持久化表或新的 Parquet 文件。
CREATE TABLE merged_data AS SELECT * FROM read_parquet(['data/part1.parquet', 'data/part2.parquet']);
COPY merged_data TO 'output/merged_data.parquet' (FORMAT PARQUET);
7. 增量读取和更新
通过增量读取新文件实现数据更新,适用于持续更新的数据源。
INSERT INTO users_table SELECT * FROM read_parquet('data/new_data_2022_01.parquet');
8. 直接处理云存储中的 Parquet 文件
DuckDB 支持从 S3、GCS 等云对象存储中读取 Parquet 文件,适合大规模数据云端分析。
SET s3_region='us-west-2';
SET s3_access_key_id='YOUR_ACCESS_KEY';
SET s3_secret_access_key='YOUR_SECRET_KEY';
SELECT * FROM read_parquet('s3://bucket-name/path/to/data.parquet');
9. 统计信息和优化
生成统计信息以优化查询执行计划,适用于频繁查询的表。
ANALYZE users_table;
10. 自定义 Parquet 文件读取选项
DuckDB 提供了自定义读取配置选项,如 Hive 分区支持等。
SELECT * FROM read_parquet('data/users.parquet', hive_partitioning=TRUE);
这些基础和高阶功能使 DuckDB 能够高效处理 Parquet 文件,适用于大规模数据分析的不同需求。