我有一个镶木地板文件,我通过转换一些avro数据文件。该文件包含复杂的记录。此外,我有这些记录的avro架构以及等效的镶木地板架构(我在转换文件时得到了它)。我想制作一个由镶木地板文件支持的蜂巢桌。
由于我的记录模式有很多字段,因此手动声明与这些字段对应的配置单元列非常困难并且容易出错。这就是为什么我希望配置单元使用记录的镶木地板模式来定义由镶木地板文件支持的表的列,这与AvroSerDe使用avro模式定义表列的方式大致相同。这是否由ParquetSerDe支持?我怎么能这样做?
P.S。我知道可能的解决方法,我可以先使用avro架构定义一个avro支持的表,然后使用CTAS语句从中创建镶木桌。但是,如果架构有工会,那就不起作用,因为AvroSerDe使用Hive联盟,而hive实际上不支持(!!)而ParquetSerDe不知道如何处理它们。
答案 0 :(得分:2)
我做了一些研究并得到了答案,所以这里是其他任何人都坚持这个:
ParquetSerDe目前不支持任何类型的表定义,除了纯DDL,您必须明确指定每列。有一个JIRA票据跟踪添加对使用现有镶木地板文件(HIVE-8950)定义表的支持。
答案 1 :(得分:1)
我们将Hive用作CDH包的一部分,其中还包括Impala。
与Hive不同,Impala已经支持Parquet文件的模式推断: http://www.cloudera.com/documentation/archive/impala/2-x/2-0-x/topics/impala_create_table.html
注意
从数据文件推断的列定义:
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] [db_name。] table_name LIKE PARQUET' hdfs_path_of_parquet_file'
目前仅适用于Parquet而不适用于AVRO文件。
因此我们实际上必须在我们的一些工作流程中使用Impala(例如,在将sqoop导入到镶木地板文件之后,或者在从外部hadoop群集进行distcp之后 - 非常有用!)。
答案 2 :(得分:0)
不幸的是,没有像smaro.schema.literal这样的parquet.schema.literal可用于使用模式定义表。
您必须在表定义中创建单独的列或使用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"]}
]
}