使用数据框的子集和 spark/scala 中的两个特定字段过滤数据框 [关闭]
Posted
技术标签:
【中文标题】使用数据框的子集和 spark/scala 中的两个特定字段过滤数据框 [关闭]【英文标题】:Filter a Dataframe using a subset of it and two specific fields in spark/scala [closed] 【发布时间】:2021-12-31 00:43:04 【问题描述】:我有一个 Scala/Spark 问题。我正在使用 Spark 2.1.1。 我有一个看起来像这样的数据框:
client | transaction | amount | machine |
---|---|---|---|
0000001 | transaction1 | -0.010000 | user000000001 |
0000002 | transaction2 | 0.010000 | user000000001 |
0000002 | transaction2 | 0.010000 | user000000002 |
0000002 | transaction2 | 0.010000 | user000000003 |
0000003 | transaction3 | -0.010000 | user000000004 |
0000003 | transaction3 | -0.010000 | user000000002 |
0000003 | transaction3 | -0.010000 | user000000003 |
0000003 | transaction3 | -0.010000 | user000000011 |
0000001 | transaction4 | 0.010000 | user000000011 |
另外,我还有另一个 Dataframe,一个子集:
client | transaction | amount | machine |
---|---|---|---|
0000002 | transaction2 | 0.010000 | user000000001 |
0000002 | transaction2 | 0.010000 | user000000002 |
0000002 | transaction2 | 0.010000 | user000000003 |
0000003 | transaction3 | -0.010000 | user000000004 |
0000003 | transaction3 | -0.010000 | user000000002 |
0000003 | transaction3 | -0.010000 | user000000003 |
0000003 | transaction3 | -0.010000 | user000000011 |
如何使用第二个过滤第一个?我不知道是否可以使用减法选项,但使用两个字段作为过滤数据框的条件。或者一种执行连接/联合但使用两种不同条件的方法。为什么要使用两个字段作为条件?好吧,如果您分析该表,您可以看到 transaction2 和 transaction3 以不同的机器标识符重复了 n 次。我只需要保留机器与非重复事务机器匹配的唯一事务的行。我的意思是,我需要这样的表格:
client | transaction | amount | machine |
---|---|---|---|
0000001 | transaction1 | -0.010000 | user000000001 |
0000002 | transaction2 | 0.010000 | user000000001 |
0000003 | transaction3 | -0.010000 | user000000011 |
0000001 | transaction4 | 0.010000 | user000000011 |
非常感谢您的帮助和指导!
【问题讨论】:
到目前为止你尝试了什么?什么不工作? 【参考方案1】:如果要从第一个数据帧中减去子数据帧,可以使用左反连接,如下所示:
dataframe.join(subset, dataframe.columns, "left_anti")
根据您的输入数据框和子集,您将获得:
+-------+------------+------+-------------+
|client |transaction |amount|machine |
+-------+------------+------+-------------+
|0000001|transaction1|-0.01 |user000000001|
|0000001|transaction4|0.01 |user000000011|
+-------+------------+------+-------------+
然后您可以获得machine
列并使用内部联接过滤您的第一个数据帧中的重复项。完整代码如下:
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.groupBy("transaction")
.agg(count("transaction").as("total"), first("machine").as("machine"))
.filter(col("total") === 1)
.select("machine")
.join(dataframe, Seq("machine"))
【讨论】:
以上是关于使用数据框的子集和 spark/scala 中的两个特定字段过滤数据框 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章