代码之家  ›  专栏  ›  技术社区  ›  Arjun

如何基于另一个数据帧中的数据填充数据帧值

  •  -1
  • Arjun  · 技术社区  · 7 年前

    查找数据框:

    +--------------------+------------------+
    |         seller_name|             codes|
    +--------------------+------------------+
    |           BlueR    |[5944, 5813, 5812]|
    |           jack     |[4814, 5734, 5968]|
    |         Cwireless  |[7349, 7399, 5999]|
    |            Tea     |[4899, 5813, 8398]|
    

    基测向:

    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 ,如果 raw_code 卖家名称 从基df出现在查找df中 codes 那么我应该保留相同的值,但是如果原始代码值是 LookUp DF比 原始代码 值应替换为该卖方元组中的第一个元素。

    edit: 如果 卖家名称 属于 base_df 不存在于 lookup DF比 原始代码 价值应该保持原样。

    预期输出DF:

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

    如何实现此功能?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Ramesh Maharjan    7 年前

    广播小节目 与basedf左联接 ,然后使用 udf 功能检查 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    |
    +-----------+--------+
    

    我希望答案对你有帮助

    推荐文章