目前,我们生产 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
我注意到错误来自第一个嵌套的结构列数组。我的问题如下:
- Parquet 是否支持结构的嵌套数组?
- 这仅与 Parquet 1.3.2 有关吗?我对 Parquet 1.3.2 有什么解决方案吗?
- 如果我必须使用更高版本的 Parquet 来解决上述问题,并且如果 Parquet 1.3.2 在运行时可用,那会导致任何问题吗?
- 我可以从镶木地板数据中使用各种 Hive 功能,例如嵌套结构的“爆炸”吗?
我们正在寻找的是知道镶木地板是否可以像我们目前使用 AVRO 一样使用,但能给我们带来 AVRO 所缺少的柱状存储优势。