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