【问题标题】:How to specify schema for parquet data in hive 0.13+如何在 hive 0.13+ 中为镶木地板数据指定模式
【发布时间】:2015-03-10 07:24:43
【问题描述】:

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

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

附:我知道可能的解决方法,我可以先使用 avro 模式定义一个 avro 支持的表,然后使用 CTAS 语句从中创建镶木地板表。但是,如果架构具有联合,则这不起作用,因为 AvroSerDe 使用 Hive 联合,而 Hive 实际上不支持 (!!) 并且 ParquetSerDe 不知道如何处理它们。

【问题讨论】:

    标签: hive avro parquet


    【解决方案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 导入 parquet 文件之后,或者在从外部 hadoop 集群进行 distcp'ing 之后 - 非常有用!)。

    【讨论】:

      【解决方案2】:

      我做了一些研究并得到了答案,所以这里是为其他被这个卡住的人准备的:

      ParquetSerDe 目前不支持任何类型的表定义,除了纯 DDL,您必须明确指定每一列。有一个 JIRA 票可以跟踪添加对使用现有 parquet 文件 (HIVE-8950) 定义表的支持。

      【讨论】:

        【解决方案3】:

        不幸的是,没有可用的 parquet.schema.literal 像 avro.schema.literal 可用于使用模式定义表。

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

        至于联合模式在 hive 中不起作用。我一直在我的 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"]}  
         ]
        }
        

        【讨论】:

        • 您是否能够访问 hive 中联合字段中的数据?
        • 您的架构有空联合,只有一个真实类型选项。这适用于镶木地板和蜂巢。我说的是你有多种可能的数据类型的联合,比如["int","string","boolean"]。 AvroSerDe 使这些成为 hive 联合类型,我只能使用自定义 UDF 来操作这种数据,因为 hive 缺乏对它们的任何支持,即使在 0.14 版本中也是如此。 ParquetSerDe 在遇到这样的列时抛出异常。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-28
        • 1970-01-01
        • 2016-10-05
        • 1970-01-01
        相关资源
        最近更新 更多