使用Trino(以前的PrestoDB)将非varchar数据导出到CSV表

使用Trino(以前的PrestoDB)将非varchar数据导出到CSV表,csv,hive,presto,trino,Csv,Hive,Presto,Trino,我正在做一些基准测试,需要比较ORC、拼花和CSV格式。我已将TPC/H(SF1000)导出到基于ORC的表中。当我想将其导出到拼花地板时,我可以运行: CREATE TABLE hive.tpch_sf1_parquet.region WITH (format = 'parquet') AS SELECT * FROM hive.tpch_sf1_orc.region 当我尝试使用CSV的类似方法时,会出现错误Hive CSV存储格式仅支持VARCHAR(无界)。我假设它会将其他数据

我正在做一些基准测试,需要比较ORC、拼花和CSV格式。我已将TPC/H(SF1000)导出到基于ORC的表中。当我想将其导出到拼花地板时,我可以运行:

CREATE TABLE hive.tpch_sf1_parquet.region
  WITH (format = 'parquet')
  AS SELECT * FROM hive.tpch_sf1_orc.region
当我尝试使用CSV的类似方法时,会出现错误
Hive CSV存储格式仅支持VARCHAR(无界)
。我假设它会将其他数据类型(即
bigint
)转换为文本,并将列格式存储在配置单元元数据中

我可以使用
trino--server trino:8080--catalog hive--schema tpch\u sf1\u orc--output format=CSV--execute'SELECT*FROM nation
,将数据导出到CSV,但随后它会被发送到一个文件中。虽然这适用于SF1,但很快就无法用于SF1000比例因子。另一个缺点是,我的Hive元存储没有适当的元数据(尽管如果没有其他方法,我可以手动修补)


有人知道如何使用Hive将我的ORC/拼花地板数据转换为CSV吗?

在Trino Hive connector中,CSV表只能包含
varchar

创建表时,需要将导出的列强制转换为
varchar

CREATE TABLE region_csv
WITH (format='CSV')
AS SELECT CAST(regionkey AS varchar), CAST(name AS varchar), CAST(comment AS varchar)
FROM region_orc

请注意,您需要相应地更新基准查询,例如通过应用反向转换。

免责声明:在使用此处讨论的任何内容之前,请阅读全文。这不是真的CSV,你可能会搞砸

使用文本文件格式并使用“,”作为字段分隔符时,可以创建键入的CSV ish表:

CREATE TABLE hive.test.region (
  regionkey bigint,
  name varchar(25),
  comment varchar(152)
)
WITH (
  format = 'TEXTFILE',
  textfile_field_separator = ','
);
这将使用
TEXTFILE
格式在配置单元目录中创建表格的键入版本。它通常使用^A字符(ASCII 10),但当设置为“”时,它的结构类似于CSV格式

重要:虽然它看起来像CSV,但它不是真正的CSV。它没有跟随,因为它没有正确地引用和转义。以下插入内容将不会插入co:

INSERT INTO hive.test.region VALUES (
  1,
  'A "quote", with comma',
  'The comment contains a newline
in it');
文本将不加修改地复制到文件中,而不转义引号或逗号。应该这样写才是正确的CSV:

1,"A ""quote"", with comma","The comment contains a newline
in it"
不幸的是,它被写为:

1,A "quote", with comma,The comment contains a newline
in it

这将导致由空列表示的无效数据。因此,只有当您完全控制基于文本的数据并且确保它不包含换行符、引号、逗号等时,才能使用此方法。

无法绕过无界varchar的配置单元限制,因此您的答案是唯一正确的答案。可以选择生成CSV ish文件,但这很危险。为了完整起见,我也添加了这个“答案”。你是对的。人们通常使用
TEXTFILE
表格格式来处理CSV数据。