如何在配置单元 0.13+ 中为镶木地板数据指定模式

How to specify schema for parquet data in hive 0.13+

我有一个镶木地板文件,是我通过转换一些 avro 数据文件制作的。该文件包含复杂的记录。我也有这些记录的 avro 模式以及等效的 parquet 模式(我在转换文件时得到它)。我想制作一个由 parquet 文件支持的配置单元 table。

因为我的记录模式有很多字段,手动声明与这些字段对应的配置单元列非常困难且容易出错。这就是为什么我希望配置单元使用记录的镶木地板模式定义由我的镶木地板文件支持的 table 的列,这与 AvroSerDe 使用 avro 模式定义 table 列的方式大致相同。 ParquetSerDe 支持吗?我该怎么做?

P.S。我知道可能的解决方法,我可以首先使用 avro 模式定义一个支持 table 的 avro,然后使用 CTAS 语句从中创建 parquet table。但是,如果模式有联合,那将不起作用,因为 AvroSerDe 使用 Hive 联合,而 Hive 实际上不支持 (!!) 并且 ParquetSerDe 不知道如何处理它们。

不幸的是,没有像 avro.schema.literal 这样的 parquet.schema.literal 可用,它可用于使用架构定义 table。

您必须在 table 定义中创建单独的列或使用 CTAS 语句。

就联合架构在配置单元中不起作用而言。我一直在我的 avsc 文件中为数据类型字段使用联合模式定义,它工作得很好

这是我的 avsc 的结构:

{"namespace": "somename",
 "type": "record",
 "name": "somename",
 "fields": [
     {"name": "col1", "type": "string"},
     {"name": "col2", "type": "string"},
     {"name": "col3", "type": ["string","null"]},
     {"name": "col4", "type": ["string", "null"]},
     {"name": "col5", "type": ["string", "null"]},
     {"name": "col6", "type": ["string", "null"]},
     {"name": "col7", "type": ["string", "null"]},
     {"name": "col8", "type": ["string", "null"]}  
 ]
}

我做了一些研究并得到了答案,所以这里是给遇到这个问题的其他人的:

ParquetSerDe 目前不支持除纯 DDL 之外的任何类型的 table 定义,在纯 DDL 中您必须明确指定每一列。有一张 JIRA 票据跟踪添加对使用现有镶木地板文件 (HIVE-8950) 定义 table 的支持。

我们使用 Hive 作为 CDH 包的一部分,它还包括 Impala。

与 Hive 不同,Impala 已经支持从 Parquet 文件推断模式: http://www.cloudera.com/documentation/archive/impala/2-x/2-0-x/topics/impala_create_table.html

通知

Column definitions inferred from data file:

CREATE [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name LIKE PARQUET 'hdfs_path_of_parquet_file'

这目前仅适用于 Parquet,不适用于 AVRO 文件。

因此,我们实际上必须在我们的一些工作流程中使用 Impala(例如,在将 sqoop 导入 parquet 文件之后,或者在从外部 hadoop 集群进行 distcp 之后 - 非常有用!)。