使用数据框的子集和 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 中的两个特定字段过滤数据框 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

在 spark scala 中对数据框的每一列进行排序

使用其他现有列 Spark/Scala 添加新列

将多索引数据框的子集除以字典中的值

在R中,获取数据框的子集,其中列中的值包含在列表中[重复]

如何在for和if循环中获取spark scala数据帧的最后一行的第一列值

Spark 中的数据框比较:Scala