【问题标题】:Hive: struct as a key in map type when creating tableHive:创建表时将结构作为映射类型中的键
【发布时间】:2016-10-05 06:58:35
【问题描述】:

我正在尝试在 Hive 中创建一个表,该表是从具有以下数据格式的 spark 作业创建的:

{'Group1': {[start=0, end=20]: 'Data goes here'}}

用于此的 spark 数据框架构是:

MapType(StringType(),
        MapType(StructType([
                StructField('start', IntegerType(), False),
                StructField('end', IntegerType(), False)]),
                StringType()))

显示为:

root
 |-- column_1: map (nullable = true)
 |    |-- key: string
 |    |-- value: map (valueContainsNull = true)
 |    |    |-- key: struct
 |    |    |-- value: string (valueContainsNull = true)
 |    |    |    |-- start: integer (nullable = true)
 |    |    |    |-- end: integer (nullable = true)

这似乎在 spark 中工作得很好,但是当我尝试从这个架构创建一个配置单元表时:

CREATE EXTERNAL TABLE test_table (
column_1 MAP<STRING, MAP<STRUCT<`start`:BIGINT,`end`:BIGINT>, STRING>>
)
STORED AS PARQUET
LOCATION 'path_to_files';

我明白了:

FAILED: ParseException cannot recognize input near 'STRUCT' '<' 'start' in primitive type specification

据我所知,它看起来像合法的表格结构。我找不到任何东西告诉我你不能将 struct 作为带有 h​​ive 2.0 的 map 中的键,而 spark 2.0 可以很好地处理它。

【问题讨论】:

  • 您的用例是什么?为什么要尝试使用 hive 命令创建 hive 表?
  • spark 数据帧可以通过两种方式创建,1) 直接从数据源 2) 从现有 RDD
  • 用例是在 hive 中创建一个表以通过 prestoDB 集群进行查询。提到 spark 只是为了表明该构造似乎是合法的,并让人们了解模式是如何形成的。
  • 删除开始和结束的单引号/反引号并尝试

标签: apache-spark hive pyspark


【解决方案1】:

在 Hive 中,Map 列的键必须是基元(即不是 Struct)。

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types#LanguageManualTypes-ComplexTypes

我强烈建议您不要将密钥设为 Struct。在您的示例中,如果我不知道开始或结束,如何访问 Map 的值?用户需要知道确切的开始和结束,并且它是否会随表中的每一行而改变?

【讨论】:

  • 有趣的是,如果我在 Spark 中创建一个带有 struct 作为键的映射列的表,Hive 能够愉快地查询它并产生输出(以比 Presto 或 Spark 更好的格式)。但是他们没有提供使用结构键创建带有映射列的表的选项!伤心...
猜你喜欢
  • 2019-01-18
  • 2011-11-12
  • 2017-05-07
  • 1970-01-01
  • 2012-05-11
  • 2021-12-06
  • 2020-06-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多