对 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 作业)的主要内容,如果未能解决你的问题,请参考以下文章

PySpark 2.2中数组列的每个元素的子串

如何在 spark sql 中对数组进行成员操作?

基于当前数组中每个项目的第一个元素创建新数组

对 ksh 中数组中的每个元素执行一个函数

用指针实现对二维数组元素的访问

matlab一维数组怎么创建及怎样对每个元素进行赋值