我对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。 有人可以帮我提出过滤操作吗?
答案 0 :(得分:3)
您可以从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|
+---+----+----+
答案 1 :(得分:-1)
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))