查询DF:
+--------------------+------------------+
| seller_name| codes|
+--------------------+------------------+
| BlueR |[5944, 5813, 5812]|
| jack |[4814, 5734, 5968]|
| Cwireless |[7349, 7399, 5999]|
| Tea |[4899, 5813, 8398]|
基础DF:
seller_name | raw_code
BlueR | 5813
jack | 5968
Cwireless | 7865
Tea | 5999
Tea | 5813
blueR | 5678
jack | 9999
Tea | null
如果seller_name
中存在BaseDF中的LookUp data frame
,并且查询DF中存在来自基本DF的raw_code
的{{1}} {{ 1}}然后我应该保留相同的值,但是如果raw_code值是除了seller_name
元组中元素之外的其他值,那么codes
值应该替换为LookUp
值中的第一个元素。那个卖家的元组。
raw_code
如果edit:
中不存在seller_name
的{{1}},则base_df
df应保留lookup
值。
预期输出DF:
raw_code
我该如何实现此功能?
答案 0 :(得分:1)
使用baseDf 广播小lookUpDf 和左连接,然后使用udf
函数检查raw_code
是否包含在codes
中1}},如果它确实返回raw_code
其他第一个codes
数组值。
import org.apache.spark.sql.functions._
def retainUdf = udf((rawCode: Int, codes:Seq[Int]) => if(codes == null || codes.isEmpty) rawCode else if(codes.contains(rawCode)) rawCode else codes.head)
baseDf.join(broadcast(lookUpDf), Seq("seller_name"), "left")
.select(col("seller_name"), retainUdf(col("raw_code"), col("codes")).as("raw_code"))
应该给你
+-----------+--------+
|seller_name|raw_code|
+-----------+--------+
|BlueR |5813 |
|jack |5968 |
|Cwireless |7349 |
|Tea |4899 |
|Tea |5813 |
|blueR |5678 |
|jack |4814 |
+-----------+--------+
我希望答案很有帮助