【发布时间】:2022-01-01 16:05:50
【问题描述】:
我有两个数据框:
RegionValues:
+-----------+----------+----------------------+
|marketplace|primary_id|values |
+-----------+----------+----------------------+
|xyz |0000000001|[cat, dog, cow] |
|reg |PRT0000001|[hippo, dragon, moose]|
|asz |0000001333|[mouse, rhino, lion] |
+-----------+----------+----------------------+
Marketplace:
+----------+-----------+----------+
|primary_id|marketplace|parent_id |
+----------+-----------+----------+
|0000000001|xyz |PRT0000001|
|0000000002|wrt |PRT0000001|
|PRT0000001|reg |PRT0000001|
|PRT00MISS0|asz |PRT00MISS0|
|000000000B|823 |PRT0000002|
+----------+-----------+----------+
当我将数据帧连接在一起时,我想根据 primary_id 值加入它们,但如果 RegionValues 数据帧中不存在 primary_id 字段,那么我想退回到加入 parent_id = == primary_id。所以我想要的输出是:
+----------+--------------+-----------+-------------------------------------+
|primary_id|marketplace |parent_id |values |
+----------+--------------+-----------+-------------------------------------+
|0000000001|... |PRT0000001 |[cat, dog, cow] |
|0000000002|... |PRT0000001 |[hippo, dragon, moose] |
|PRT0000001|... |PRT0000001 |[hippo, dragon, moose] |
|PRT00MISS0| |PRT00MISS0 |null |
|0000001333| |0000001333 |[mouse, rhino, lion] |
|000000000B| |PRT0000002 |null |
+----------+--------------+-----------+-------------------------------------+
请注意,0000000001 保持其原始 values,但 0000000002 采用其 parent_id 的 values,因为它不存在于 RegionValues 中。是否可以在 join 语句中完成此逻辑?我正在使用 Scala 和 Spark。
我曾尝试使用这样的连接语句,但这会导致 0000000002 值出现空值:
val parentIdJoinCondition = when(
(regionValuesDf.col("primary_id") === marketplaceDf.col("primary_id")).isNull,
marketplaceDf.col("parent_id") === regionValuesDf.col("primary_id")
).otherwise(regionValuesDf.col("primary_id") === marketplaceDf.col("primary_id"))
val joinedDf = regionDf.join(
marketplaceDf,
parentIdJoinCondition,
"outer"
)
我想我可以通过使用 3 个不同的连接来获得我想要的结果,但这似乎没有必要并且更难阅读。
【问题讨论】:
标签: scala apache-spark apache-spark-sql