使用scala中的自定义函数过滤Spark数据集

时间:2017-09-15 22:09:16

标签: scala apache-spark

我对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。 有人可以帮我提出过滤操作吗?

2 个答案:

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