使用 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 列表示的无效数据。因此,只有当您完全控制基于文本的数据并确保它不包含换行符、引号、逗号、...
时,才能使用此方法
我正在研究一些基准测试,需要比较 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 列表示的无效数据。因此,只有当您完全控制基于文本的数据并确保它不包含换行符、引号、逗号、...
时,才能使用此方法