我有一个包含以下列的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的方法非常慢!
答案 0 :(得分:0)
最后我找到了解决这个问题的方法。在UDF中使用配置单元构建:struct
和collect_set
。
struct
将在新结构中打包传递给它的所有列,然后,您可以根据请求使用collect_set
(或collect_list
)来构建结构数组。代码如:
select id, collect_set(struct(address, address_id, bay)) as Address from oriTable;
在旧版本中,collect_set不能接收struct而只接收原始列,但在新版本中它支持struct。