我正在进行一些基准测试,需要比较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表只能包含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,你可能会搞砸!
当使用TEXTFILE格式并使用","作为字段分隔符时,可以创建类型化的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。它不遵循RFC 4180,因为它没有正确地引用和转义。以下插入将不会被插入:
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列表示的无效数据。因此,只有当您完全控制基于文本的数据,并且确保它不包含换行符、引号、逗号…时,才能使用此方法。。。