如何根据另一个数据框中的数据填充Dataframe值

时间:2018-06-02 18:25:51

标签: scala apache-spark

查询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

我该如何实现此功能?

1 个答案:

答案 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    |
+-----------+--------+

我希望答案很有帮助