首页 > 解决方案 > Spark Dataframes AND/OR 在同一个单元格中

问题描述

我有两个 Spark DataFrame,如下所示:

DF1

join_key  d1 d2 d3
 a        1   1  1
 b        0   1  0

DF2

join_key  d1 d2 d3
 a        1   0  0
 b        0   1  0

d1,d2,d3 中的所有值都是 1 或 0,并且两个 DataFrame 具有相同的列和 join_key 值。除了join_key,我想在每个单元格中生成类似“AND”的结果,如下所示:

结果 = DF1 & DF2(在 d1,d2,d3 中的每个单元格中执行 AND 操作)

join_key  d1 d2 d3
 a        1   0  0
 b        0   1  0 

我想知道这有可能在 Spark DataFrame 中实现吗?如何生成,非常感谢。

标签: apache-sparkapache-spark-sql

解决方案


看起来您需要 use union,而不是join,因为您在两个数据框中都有完全相同的架构。如果是这样,您可以简单地使用min聚合函数。如果您有多个列,则可以对其进行迭代并生成相同的转换,这是一个示例:

val commonColumns = (df1.columns.toSet & df2.columns.toSet).filter(_ != "join_key").toSeq
commonColumns

df1.union(df2)
    .groupBy("join_key")
    .agg(count(lit(1)) as "cnt", 
        commonColumns.map(c => when(min(col(c)) > 0, 1).otherwise(0) as c):_*)
    .select("join_key", commonColumns:_*)
        .show

输出是:

+--------+---+---+---+
|join_key| d1| d2| d3|
+--------+---+---+---+
|       b|  0|  1|  0|
|       a|  1|  0|  0|
+--------+---+---+---+

推荐阅读