searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

duckdb 操作parquet

2024-10-31 09:28:58
57
0
### 基础操作

#### 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 文件,适用于大规模数据分析的不同需求。

0条评论
0 / 1000
陈****君
2文章数
0粉丝数
陈****君
2 文章 | 0 粉丝
陈****君
2文章数
0粉丝数
陈****君
2 文章 | 0 粉丝
原创

duckdb 操作parquet

2024-10-31 09:28:58
57
0
### 基础操作

#### 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 文件,适用于大规模数据分析的不同需求。

文章来自个人专栏
文章 | 订阅
0条评论
0 / 1000
请输入你的评论
0
0