对sparksql中数组列的每个元素执行udf(需要另一个spark作业)

gcuhipw9  于 2021-06-01  发布在  Hadoop
关注(0)|答案(1)|浏览(312)

Hive表的结构( tbl_a )具体如下:

name | ids
A    | [1,7,13,25168,992]
B    | [223, 594, 3322, 192928]
C    | null
...

另一张Hive桌( tbl_b )在id到新的\u id之间有相应的Map。此表太大,无法加载到内存中

id | new_id
1  | 'aiks'
2  | 'ficnw'
...

我打算创建一个新的配置单元表,使其结构与 tbl_a ,但将id数组转换为新的\u id数组:

name | ids
A    | ['aiks','fsijo','fsdix','sssxs','wie']
B    | ['cx', 'dds', 'dfsexx', 'zz']
C    | null
...

有谁能告诉我如何在sparksql或sparkdataframe中实现这个场景?谢谢!

mkh04yzy

mkh04yzy1#

这是一个昂贵的操作,但您可以使用coalesce、explode和left outer join来实现它,如下所示:

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

相关问题