如何通过比较火花中相同列的两个数据帧来计算列值的数量

Posted

技术标签:

【中文标题】如何通过比较火花中相同列的两个数据帧来计算列值的数量【英文标题】:How to calculate the number of column values got changed by comparing two dataframes with same columns in spark 【发布时间】:2017-11-20 09:47:08 【问题描述】:

如何比较两个数据帧并根据使用 spark 的连接键获取从第一个数据帧更改为第二个数据帧的列数。

df1
id val1  val2  val3  val4
1   a    b    c    d
2   d    f    k    e
4   r    t    y    u

df2
id val1 val2 val3 val4
1   a    h    c    l
2   d    f    k    e
4   g    a    w    u

count:
id  count
1    2
2    0
4    3

【问题讨论】:

您有没有尝试过任何方法? :) 【参考方案1】:
from pyspark.sql.functions import col

#change aliases to avoid duplicate columns in joined dataframe
df2=df2.select(*(col(x).alias('d2'+x) for x in df2.columns))

joineddf=df1.alias('df1').join(df2.alias('df2'), df1.id == df2.d2id) 
col = [z for z in df1.columns]
jd=joineddf.rdd.map(lambda row: (row.id,sum([int( not x) for x in [row[y]==row['d2'+y] for y in col ]])))

spark.createDataFrame(jd, ['id', 'count']).show()  
Output:
+---+-----+
| id|count|
+---+-----+
|  1|    2|
|  2|    0|
|  4|    3|
+---+-----+

我已获取 sum 中的所有列,包括“id”字段,因为结果 0 不会添加到总和中。

希望有帮助!

【讨论】:

如果每个数据框中的列数很大,我们需要做什么。上面又是一个sql查询。我们有任何使用数据帧或 RDD 的解决方案吗?

以上是关于如何通过比较火花中相同列的两个数据帧来计算列值的数量的主要内容,如果未能解决你的问题,请参考以下文章

如何获取和比较pyspark中两个数据框中相似列的所有值的数据类型

SQL如何查询出某一列中不同值出现的次数?

如何从 sqlite 游标中获取列值?

如何通过熊猫或火花数据框删除所有行中具有相同值的列?

连接具有相同值的行的列值(不同列的)

计算火花数据框中所有列(300 列)的每个不同值的出现次数