首页 > 解决方案 > 如何根据另一个数据框中的数据填充数据框值

问题描述

查找 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_nameBaseDF中LookUp data frame的_ _ _比该值应替换为该卖方元组中的第一个元素。raw_codeseller_namecodesLookUpraw_code

edit:如果df中不存在seller_nameof ,则应按原样保留该值。base_dflookupraw_code

预期输出 DF:

seller_name   | revised_code
blueR         | 5813
jack          | 5968
Cwireless     | 7349
Tea           | 4899
Tea           | 5813
blueR         | 5678
jack          | 4814
Tea           | 4899

我该如何实现这个功能?

标签: scalaapache-spark

解决方案


广播小的lookUpDf与baseDf左连接,然后使用udf函数检查是否raw_code包含在中codes,如果确实返回数组的raw_codeelse第一个值。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    |
+-----------+--------+

我希望答案有帮助


推荐阅读