【问题标题】:How to subtract DataFrames using subset of columns in Apache Spark如何使用 Apache Spark 中的列子集减去 DataFrame
【发布时间】:2019-12-25 23:57:31
【问题描述】:

如何使用 Dataframe2 对 Dataframe1 执行过滤操作。 我想从 DataFrame1 中删除以下匹配条件的行

Dataframe1.col1 = Dataframe2.col1
Dataframe1.col2 = Dataframe2.col2

我的问题与减去两个数据框不同,因为在减去时我们使用所有列,但在我的问题中我想使用有限数量的列

【问题讨论】:

  • 我的问题与减去两个数据帧不同,因为在减去时我们使用所有列,但在我的问题中我想使用有限数量的列

标签: scala apache-spark


【解决方案1】:

:Spark: subtract two DataFrames 如果两个数据集具有完全相同的列,则可能重复

如果您想要自定义连接条件,那么您可以使用“反”连接。这是pysaprk版本

创建两个数据框:

数据框1:

l1 = [('col1_row1', 10), ('col1_row2', 20), ('col1_row3', 30)
df1 = spark.createDataFrame(l1).toDF('col1','col2')

df1.show()
+---------+----+
|     col1|col2|
+---------+----+
|col1_row1|  10|
|col1_row2|  20|
|col1_row3|  30|
+---------+----+

数据框2:

l2 = [('col1_row1', 10), ('col1_row2', 20), ('col1_row4', 40)]
df2 = spark.createDataFrame(l2).toDF('col1','col2')
df2.show()
+---------+----+
|     col1|col2|
+---------+----+
|col1_row1|  10|
|col1_row2|  20|
|col1_row4|  40|
+---------+----+

使用减法 api:

df_final = df1.subtract(df2)
df_final.show()
+---------+----+
|     col1|col2|
+---------+----+
|col1_row3|  30|
+---------+----+

使用 left_anti :

加盟条件:

join_condition = [df1["col1"] == df2["col1"], df1["col2"] == df2["col2"]]

最后加入

df_final = df1.join(df2, join_condition, 'left_anti')
df_final.show()
+---------+----+
|     col1|col2|
+---------+----+
|col1_row3|  30|
+---------+----+

【讨论】:

    【解决方案2】:

    加入与“left_anti

    scala> df1.show
    +----+-----+-----+
    |col1| col2| col3|
    +----+-----+-----+
    |   1|  one|   ek|
    |   2|  two|  dho|
    |   3|three|theen|
    |   4| four|chaar|
    +----+-----+-----+
    
    
    scala> df2.show
    +----+----+-----+
    |col1|col2| col3|
    +----+----+-----+
    |   2| two|  dho|
    |   4|four|chaar|
    +----+----+-----+
    
    
    scala> df1.join(df2, Seq("col1", "col2"), "left_anti").show
    +----+-----+-----+
    |col1| col2| col3|
    +----+-----+-----+
    |   1|  one|   ek|
    |   3|three|theen|
    +----+-----+-----+
    

    【讨论】:

    • 感谢它对我有用!这里使用 Java Dataset filterDf = dataset1.join(dataset2,JavaConverters.asScalaIteratorConverter(Arrays.asList(new String[]{"col1", "col2"}).iterator()).asScala().toSeq( ),"left_anti");
    • @Gaurang 如果可能,请将问题主题从“如何过滤 Spark 中的数据帧”编辑为更具体。它可以帮助其他人满足他们的特定需求。
    • 您有什么建议吗?
    • DataFrames 减去列的子集?就像你在描述中描述的那样。
    • 感谢您的建议..我更改了问题标题。
    猜你喜欢
    • 2015-06-14
    • 2018-03-04
    • 1970-01-01
    • 1970-01-01
    • 2017-11-19
    • 2015-10-05
    相关资源
    最近更新 更多