语境
我使用 PostgreSQL 生成的 csv 文件创建了一个带有 duckdb 的 parquet 文件。这是使用的duckdb命令:
COPY (
SELECT *
FROM read_csv_auto(
'main.csv.gz',
delim='@',
header=True,
columns={'id': 'VARCHAR','stringArr': 'VARCHAR[]'}
)
)
TO 'main.parquet' (FORMAT 'parquet');
我留下stringArr
了镶木地板文件中的列,如下所示:
字符串Arr |
---|
{"Paint","Banana","500 Turnaround","Anti..."} |
{"Donald","Crouton","500 Turnaround","Anti..."} |
哪个是VARCHAR
(或BYTE_ARRAY
?)列,而不是VARCHAR[]
列。它没有检测到 PostgreSQL 的列表列编码。
问题
我有一个具有以下架构的镶木地板文件:
文件名 | 姓名 | 类型 | 类型长度 | 重复类型 | num_children | 转换类型 | 规模 | 精确 | field_id | 逻辑类型 |
---|---|---|---|---|---|---|---|---|---|---|
主镶木地板 | 鸭数据库模式 | 布尔值 | 0 | 必需的 | 6 | UTF8 | 0 | 0 | 0 | |
主镶木地板 | ID | BYTE_ARRAY | 0 | 可选的 | 0 | UTF8 | 0 | 0 | 0 | |
主镶木地板 | 字符串Arr | BYTE_ARRAY | 0 | 可选的 | 0 | UTF8 | 0 | 0 | 0 |
我试图在写入另一个镶木地板文件时从该文件中读取数据,目的是将astringArr
列转换VARCHAR
为 a VARCHAR[]
。
我首先尝试了以下命令:
COPY (
SELECT
id,
string_split(stringArr,'","')::VARCHAR[] as stringArr,
FROM 'main.parquet'
) TO 'main_with_list_col.parquet' (FORMAT 'parquet');
但是,我收到以下错误:
Error: Not implemented Error: LIST<VARCHAR>
我试过的
我尝试了一种解决方法,方法是创建一个main
在duckdb(非瞬态)数据库中调用的表,以便在写入COPY
新main2.parquet
文件之前临时保存数据。
INSERT INTO main (id, stringArr)
SELECT
id,
string_split(stringArr,'","')::VARCHAR[] as stringArr
FROM 'main.parquet'
但是,这很慢并且占用了我系统中的所有内存(64 GB)。正在读取的 parquet 文件非常大(35 GB)。这似乎不是一种最佳方法,因为不必要的双重写入磁盘 - 一次用于duckdb表,另一个用于创建具有所需VARCHAR[]
列的镶木地板文件。
COPY
有没有办法像 CSV 一样在开始之前定义镶木地板文件的模式?什么是一个好的方法?