簡體   English   中英

使用 Dataframe 的子集和 spark/scala 中的兩個特定字段過濾 Dataframe

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM