使用 Trino(以前称为 PrestoDB)将非 varchar 数据导出到 CSV table

Export non-varchar data to CSV table using Trino (formerly PrestoDB)

我正在研究一些基准测试,需要比较 ORC、Parquet 和 CSV 格式。我已将 TPC/H (SF1000) 导出到基于 ORC 的表。当我想将它导出到 Parquet 时,我可以 运行:

CREATE TABLE hive.tpch_sf1_parquet.region
  WITH (format = 'parquet')
  AS SELECT * FROM hive.tpch_sf1_orc.region

当我尝试使用 CSV 的类似方法时,出现错误 Hive CSV storage format only supports VARCHAR (unbounded)。我假设它会将其他数据类型(即 bigint)转换为文本并将列格式存储在 Hive 元数据中。

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

有人知道如何使用 Hive 将我的 ORC/Parquet 数据转换为 CSV 格式吗?

在 Trino Hive 连接器中,CSV table 只能包含 varchar 列。

您需要在创建 table

时将导出的列转换为 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

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

免责声明: 在使用此处讨论的任何内容之前,请阅读完整内容 post。这不是真正的 CSV,你可能搞砸了!

使用 TEXTFILE 格式并使用“,”作为字段分隔符时,可以创建类型化的 CSV-ish tables:

CREATE TABLE hive.test.region (
  regionkey bigint,
  name varchar(25),
  comment varchar(152)
)
WITH (
  format = 'TEXTFILE',
  textfile_field_separator = ','
);

这将使用 TEXTFILE 格式在 Hive 目录中创建 table 的类型化版本。它通常使用 ^A 字符 (ASCII 10),但当设置为 ',' 时,它类似于 CSV 格式的相同结构。

重要提示:虽然它看起来像 CSV,但它不是真正的 CSV。它不遵循 RFC 4180,因为它没有正确引用和转义。下面的INSERT不会插入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

这会导致将由 NULL 列表示的无效数据。因此,只有当您完全控制基于文本的数据并确保它不包含换行符、引号、逗号、...

时,才能使用此方法