繁体   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