[英]scala/spark filter dataframe with multiple conditions using sql
[英]Filter a Dataframe using a subset of it and two specific fields in spark/scala
我有一個 Scala/Spark 問題。 我正在使用 Spark 2.1.1。 我有一個看起來像這樣的 Dataframe:
客戶 | 交易 | 數量 | 機器 |
---|---|---|---|
0000001 | 交易1 | -0.010000 | 用戶000000001 |
0000002 | 交易2 | 0.010000 | 用戶000000001 |
0000002 | 交易2 | 0.010000 | 用戶000000002 |
0000002 | 交易2 | 0.010000 | 用戶000000003 |
0000003 | 交易3 | -0.010000 | 用戶000000004 |
0000003 | 交易3 | -0.010000 | 用戶000000002 |
0000003 | 交易3 | -0.010000 | 用戶000000003 |
0000003 | 交易3 | -0.010000 | 用戶000000011 |
0000001 | 交易4 | 0.010000 | 用戶000000011 |
另外,我還有另一個 Dataframe,一個子集:
客戶 | 交易 | 數量 | 機器 |
---|---|---|---|
0000002 | 交易2 | 0.010000 | 用戶000000001 |
0000002 | 交易2 | 0.010000 | 用戶000000002 |
0000002 | 交易2 | 0.010000 | 用戶000000003 |
0000003 | 交易3 | -0.010000 | 用戶000000004 |
0000003 | 交易3 | -0.010000 | 用戶000000002 |
0000003 | 交易3 | -0.010000 | 用戶000000003 |
0000003 | 交易3 | -0.010000 | 用戶000000011 |
如何使用第二個過濾第一個? 我不知道是否可以使用減法選項,但使用兩個字段作為過濾 dataframe 的條件。 或者一種執行連接/聯合但使用兩種不同條件的方法。 為什么要使用兩個字段作為條件? 好吧,如果您分析該表,您可以看到 transaction2 和 transaction3 以不同的機器標識符重復了 n 次。 我只需要保留機器與非重復事務機器匹配的唯一事務的行。 我的意思是,我需要這樣的表:
客戶 | 交易 | 數量 | 機器 |
---|---|---|---|
0000001 | 交易1 | -0.010000 | 用戶000000001 |
0000002 | 交易2 | 0.010000 | 用戶000000001 |
0000003 | 交易3 | -0.010000 | 用戶000000011 |
0000001 | 交易4 | 0.010000 | 用戶000000011 |
非常感謝您對此的幫助和指導!
如果要從第一個 dataframe 中減去子集 dataframe,可以使用左反連接,如下所示:
dataframe.join(subset, dataframe.columns, "left_anti")
給定您的輸入 dataframe 和您的子集,您將獲得:
+-------+------------+------+-------------+
|client |transaction |amount|machine |
+-------+------------+------+-------------+
|0000001|transaction1|-0.01 |user000000001|
|0000001|transaction4|0.01 |user000000011|
+-------+------------+------+-------------+
然后您可以獲取machine
列並使用內部連接過濾您的第一個 dataframe 中的重復項。 完整的代碼如下:
dataframe.join(subset, dataframe.columns, "left_anti")
.select("machine")
.join(dataframe, Seq("machine"))
你會得到你預期的結果:
+-------------+-------+------------+------+
|machine |client |transaction |amount|
+-------------+-------+------------+------+
|user000000001|0000001|transaction1|-0.01 |
|user000000001|0000002|transaction2|0.01 |
|user000000011|0000003|transaction3|-0.01 |
|user000000011|0000001|transaction4|0.01 |
+-------------+-------+------------+------+
但是,在您的情況下,我認為您不需要構建子集 dataframe,您可以通過僅使用第一個 dataframe 來獲得結果,如下所示:
dataframe.groupBy("transaction")
.agg(count("transaction").as("total"), first("machine").as("machine"))
.filter(col("total") === 1)
.select("machine")
.join(dataframe, Seq("machine"))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.