对 SparkSQL 中数组列的每个元素执行 UDF(需要另一个 spark 作业)
Posted
技术标签:
【中文标题】对 SparkSQL 中数组列的每个元素执行 UDF(需要另一个 spark 作业)【英文标题】:Do UDF (which another spark job is needed) to each element of array column in SparkSQL 【发布时间】:2017-06-01 20:56:21 【问题描述】:一个hive表(tbl_a
)的结构如下:
name | ids
A | [1,7,13,25168,992]
B | [223, 594, 3322, 192928]
C | null
...
另一个 hive 表 (tbl_b
) 有对应的 id 到 new_id 的映射。这张表很大,无法加载到内存中
id | new_id
1 | 'aiks'
2 | 'ficnw'
...
我打算新建一个hive表,结构和tbl_a
一样,但是把id的数组转换成new_id的数组:
name | ids
A | ['aiks','fsijo','fsdix','sssxs','wie']
B | ['cx', 'dds', 'dfsexx', 'zz']
C | null
...
谁能给我一些关于如何在 spark sql 或 spark DataFrame 中实现这个场景的想法?谢谢!
【问题讨论】:
【参考方案1】:这是一项昂贵的操作,但您可以使用合并、分解和左外连接来实现,如下所示:
tbl_a
.withColumn("ids", coalesce($"ids", array(lit(null).cast("int"))))
.select($"name", explode($"ids").alias("id"))
.join(tbl_b, Seq("id"), "leftouter")
.groupBy("name").agg(collect_list($"new_id").alias("ids"))
.show
【讨论】:
以上是关于对 SparkSQL 中数组列的每个元素执行 UDF(需要另一个 spark 作业)的主要内容,如果未能解决你的问题,请参考以下文章