在配置单元中,如何从表生成数组类型数据

时间:2016-09-08 06:59:32

标签: arrays hive hiveql

我有一个包含以下列的hive表:

root
 |-- id: string (nullable = true)
 |-- address: string (nullable = true)
 |-- address_id: string (nullable = true)
 |-- bay: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- bay_id: string (nullable = true)
 |    |    |-- section_id: long (nullable = true)

对于一个id,有许多相关的地址和相关的bay数组(hive镶木桌的数组类型)。我想生成一个新表,如:

id, array(related_address, related_array, ...)
root
 |-- id: string (nullable = true)
 |-- Address: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- address: string (nullable = true)
 |    |    |-- address_id: string (nullable = true)
 |    |    |-- bay: array (nullable = true)
 |    |    |    |-- element: struct (containsNull = true)
 |    |    |    |    |-- bay_id: string (nullable = true)
 |    |    |    |    |-- section_id: long (nullable = true)

目前,我将DataFrame转为RDD以收集相关数据:

dt.rdd.map(r=>{
  val id = r.getAs[String](1)
  val rest = (2 to columnLength).map(x=>r.get(x))
  (id, Row(rest: _*))
}.groupByKey().map(tuple=>Row(tuple._1, tuple._2.toSeq)

我得到类似Row[id, Array[related_address, related_array, ...]]的内容,然后,我制作了一个类似StructType(structTypeOfId +: ArrayType(relatedAddrType, ...))的架构。最后,我将通过架构和RDD创建所需的DataFrame。

但是我怎样才能通过蜂巢获得所需的架构?通过RDD的方法非常慢!

1 个答案:

答案 0 :(得分:0)

最后我找到了解决这个问题的方法。在UDF中使用配置单元构建:structcollect_setstruct将在新结构中打包传递给它的所有列,然后,您可以根据请求使用collect_set(或collect_list)来构建结构数组。代码如:

select id, collect_set(struct(address, address_id, bay)) as Address from oriTable;

在旧版本中,collect_set不能接收struct而只接收原始列,但在新版本中它支持struct。