【问题标题】:Filter Spark dataset using custom function in scala在 scala 中使用自定义函数过滤 Spark 数据集
【发布时间】:2017-09-15 22:09:15
【问题描述】:

我对 Spark 比较陌生,我正在尝试从 Spark 数据集中过滤掉无效记录。 我的数据集如下所示:

| Id | Curr| Col3 |

| 1  | USD | 1111 |
| 2  | CNY | 2222 |
| 3  | USD | 3333 |
| 1  | CNY | 4444 |

在我的逻辑中,每个 ID 都有一个有效货币。所以基本上会是id->currency的地图

val map = Map(1 -> "USD", 2 -> "CNY")

我想从数据集中过滤掉 Id 与有效货币代码不对应的行。所以在我的过滤操作之后,数据集应该是这样的:

| Id | Curr| Col3 |

| 1  | USD | 1111 |
| 2  | CNY | 2222 |

这里的限制是我不能使用 UDF。 有人可以帮我想出一个过滤操作吗?

【问题讨论】:

    标签: scala apache-spark


    【解决方案1】:

    您可以从map 创建一个数据框,然后与原始数据框进行内部连接以过滤它:

    val map_df = map.toSeq.toDF("Id", "Curr")
    // map_df: org.apache.spark.sql.DataFrame = [Id: int, Curr: string]
    
    df.join(map_df, Seq("Id", "Curr")).show
    +---+----+----+
    | Id|Curr|Col3|
    +---+----+----+
    |  1| USD|1111|
    |  2| CNY|2222|
    +---+----+----+
    

    【讨论】:

    • 也许我的问题不够清楚。数据集可能有一行具有有效 Id 但货币代码无效。喜欢(1,人民币,333)。在这种情况下,我也想删除这些条目。我将更新我的问题以反映这种情况。
    • 你想让Id和货币同时匹配吗?
    • 是的,我基本上只想保留具有有效IdCurrency 信息的行。任何与IdCurrency 列不匹配的行都应该被删除。
    【解决方案2】:
    val a = List((1,"USD",1111),(2,"CAN",2222),(3,"USD",4444),(1,"CAN",5555))
    val b = Map(1 -> "USD",2 -> "CAN")
    a.filter(x => b.keys.exists(_ == x._1)).filter(y => y._2 == b(y._1))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-22
      • 2016-06-12
      • 1970-01-01
      • 2022-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-04
      相关资源
      最近更新 更多