0

语境

我使用 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(非瞬态)数据库中调用的表,以便在写入COPYmain2.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 一样在开始之前定义镶木地板文件的模式?什么是一个好的方法?

4

0 回答 0