【问题标题】:Invalid parquet hive schema: repeated group array无效的镶木地板配置单元架构:重复的组数组
【发布时间】:2015-03-01 01:19:42
【问题描述】:

目前,我们生产 Hadoop 集群上的大多数数据集都以 AVRO + SNAPPY 格式存储。听说 Parquet 有很多好东西,想试试看。

我关注this web page,更改了我们的一个 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 是否支持 struct 的嵌套数组?
  2. 这仅与 Parquet 1.3.2 有关吗? Parquet 1.3.2 有什么解决方案吗?
  3. 如果我必须使用更高版本的 Parquet 来解决上述问题,并且如果 Parquet 1.3.2 在运行时可用,这会导致任何问题吗?
  4. 能否从 parquet 数据中使用各种 Hive 功能,例如嵌套结构的“爆炸”?

我们正在寻找的是了解镶木地板是否可以像我们目前使用 AVRO 一样使用,但它可以为我们提供 AVRO 所缺少的列式存储优势。

【问题讨论】:

    标签: hive avro parquet


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-18
      • 2019-05-15
      • 2020-12-20
      • 1970-01-01
      • 2020-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多