将 avro 转换为镶木地板(也许使用 hive?)

Posted

技术标签:

【中文标题】将 avro 转换为镶木地板(也许使用 hive?)【英文标题】:Converting avro to parquet (using hive maybe?) 【发布时间】:2016-12-02 21:30:19 【问题描述】:

我正在尝试将存储在 HDFS(100 GB)上的一堆多部分 avro 文件转换为 parquet 文件(保留所有数据)

Hive 可以使用以下方法将 avro 文件作为外部表读取:

CREATE EXTERNAL TABLE as_avro 
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.avro.AvroSerDe' 
STORED as INPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat' 
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat' 
LOCATION '<location>' 
TBLPROPERTIES ('avro.schema.url'='<schema.avsc>');

但是当我尝试创建镶木地板时:

create external table as_parquet like as_avro stored as parquet location 'hdfs:///xyz.parquet'

它会抛出一个错误:

FAILED:执行错误,从 org.apache.hadoop.hive.ql.exec.DDLTask 返回代码 1。 java.lang.UnsupportedOperationException:未知字段类型:uniontype<...>

是否可以将 uniontype 转换为外部 parquet 表的有效数据类型?

我也愿意接受其他更简单的方法。先生?猪?

寻找一种快速、简单且需要考虑的依赖项最少的方法。

谢谢

【问题讨论】:

检查联合是一个真正的联合还是只是null和一个单一的真正类型的联合。后者只是表示一个可选值,您可以在 Parquet 中使用 optional 关键字而不是联合来表示相同的类型。 @Zoltan 这是一个真正的联合,但即使我能够使用 hive 从其中选择一些字段然后写入 Parquet 也可以。横向视图 explode() 在包含联合类型的数组字段上也失败。 【参考方案1】:

尝试拆分这个:

create external table as_parquet like as_avro stored as parquet location 'hdfs:///xyz.parquet'

分为两步:

    CREATE EXTERNAL TABLE as_parquet (col1 col1_type, ... , coln coln_type) STORED AS parquet LOCATION 'hdfs:///xyz.parquet';

    INSERT INTO TABLE as_parquet SELECT * FROM as_avro;

或者,如果你有分区,我猜你有这个数据量:

INSERT INTO TABLE as_parquet PARTITION (year=2016, month=07, day=13) SELECT <all_columns_except_partition_cols> FROM as_avro WHERE year='2016' and month='07' and day='13';

注意: 对于第 1 步,为了节省列类型等中的任何拼写错误或小错误,您可以:

运行SHOW CREATE TABLE as_avro,复制as_avro表的create语句 替换表名、文件格式和表位置 运行新的创建语句。

这对我有用...

【讨论】:

创建外部表查询失败:失败:SemanticException [错误 10043]:应指定列列表或自定义序列化程序。我尝试添加 'like as_avro' 并引发此错误:失败:执行错误,从 org.apache.hadoop.hive.ql.exec.DDLTask 返回代码 1。 java.lang.UnsupportedOperationException:未知字段类型:uniontype<..> 它仍然抛出错误:FAILED: ParseException line 29:1018 cannot identify input near 'void' ',' 'struct' in column type 您是否尝试过复制现有表创建语句并仅更改名称、文件格式和位置的提示? 是的,我就是这么做的 如果你可以发布你正在运行的创建语句,我会检查它

以上是关于将 avro 转换为镶木地板(也许使用 hive?)的主要内容,如果未能解决你的问题,请参考以下文章

使用python将csv转换为镶木地板文件

如何将 csv 文件转换为镶木地板

转换为镶木地板的 csv 文件将“e0”添加到值的末尾

带有 hive 的 pyspark - 无法正确创建分区并从数据框中保存表

使用胶水保存为镶木地板文件时会修改数据帧标头

优化多次使用的表:使数据帧持久化或另存为镶木地板