-1

目前,我们生产 Hadoop 集群上的大多数数据集都存储为 AVRO + SNAPPY 格式。我听说了很多关于 Parquet 的好消息,并想尝试一下。

我按照这个网页,更改了我们的一个 ETL 以生成 Parquet 文件,而不是 Avro,作为我们减速器的输出。我使用 Parquet + Avro 模式来生成最终输出数据,以及 snappy 编解码器。一切正常。所以最终输出的 parquet 文件应该与我们的原始 Avro 文件具有相同的架构。

现在,我尝试为这些 Parquet 文件创建一个 Hive 表。目前,我们使用的 IBM BigInsight 3.0 包含 Hive 12 和 Parquet 1.3.2。基于我们的 Avro 模式文件,我得出以下 Hive DDL:

create table xxx {col1 bigint, col2 string,.................field1 array<struct<sub1:string, sub2:string, date_value:bigint>>,field2 array<struct<..............>>ROW FORMAT SERDE 'parquet.hive.serde.ParquetHiveSerDe' STORED AS INPUTFORMAT 'parquet.hive.DeprecatedParquetInputFormat' OUTPUTFORMAT 'parquet.hive.DeprecatedParquetOutputFormat' location 'xxxx'

该表在 Hive 12 中成功创建,我可以“desc table”没有任何问题。但是当我尝试查询表时,例如“select * from table limit 2”,我收到以下错误:

Caused by: java.lang.RuntimeException: Invalid parquet hive schema: repeated group array { required binary sub1 (UTF8); optional binary sub2 (UTF8); optional int64 date_value;} at parquet.hive.convert.ArrayWritableGroupConverter.<init>(ArrayWritableGroupConverter.java:56) at parquet.hive.convert.HiveGroupConverter.getConverterFromDescription(HiveGroupConverter.java:36) at parquet.hive.convert.DataWritableGroupConverter.<init>(DataWritableGroupConverter.java:61) at parquet.hive.convert.DataWritableGroupConverter.<init>(DataWritableGroupConverter.java:46) at parquet.hive.convert.HiveGroupConverter.getConverterFromDescription(HiveGroupConverter.java:38) at parquet.hive.convert.DataWritableGroupConverter.<init>(DataWritableGroupConverter.java:61) at parquet.hive.convert.DataWritableGroupConverter.<init>(DataWritableGroupConverter.java:40) at parquet.hive.convert.DataWritableRecordConverter.<init>(DataWritableRecordConverter.java:32) at parquet.hive.read.DataWritableReadSupport.prepareForRead(DataWritableReadSupport.java:109) at parquet.hadoop.InternalParquetRecordReader.initialize(InternalParquetRecordReader.java:142) at parquet.hadoop.ParquetRecordReader.initializeInternalReader(ParquetRecordReader.java:118) at parquet.hadoop.ParquetRecordReader.initialize(ParquetRecordReader.java:107) at parquet.hive.MapredParquetInputFormat$RecordReaderWrapper.<init>(MapredParquetInputFormat.java:230) at parquet.hive.MapredParquetInputFormat.getRecordReader(MapredParquetInputFormat.java:119) at org.apache.hadoop.hive.ql.exec.FetchOperator.getRecordReader(FetchOperator.java:439) at org.apache.hadoop.hive.ql.exec.FetchOperator.getNextRow(FetchOperator.java:522) ... 14 more

我注意到错误来自第一个嵌套的结构列数组。我的问题如下:

  1. Parquet 是否支持结构的嵌套数组?
  2. 这仅与 Parquet 1.3.2 有关吗?我对 Parquet 1.3.2 有什么解决方案吗?
  3. 如果我必须使用更高版本的 Parquet 来解决上述问题,并且如果 Parquet 1.3.2 在运行时可用,那会导致任何问题吗?
  4. 我可以从镶木地板数据中使用各种 Hive 功能,例如嵌套结构的“爆炸”吗?

我们正在寻找的是知道镶木地板是否可以像我们目前使用 AVRO 一样使用,但能给我们带来 AVRO 所缺少的柱状存储优势。

4

1 回答 1

0

看起来 Hive 12 不支持 parquet 文件的嵌套结构,如此 Jira 票证所示。

https://issues.apache.org/jira/browse/HIVE-8909

于 2015-03-03T18:32:55.767 回答