Python 从值不同的两个数据帧中获取列

Python 从值不同的两个数据帧中获取列,python,pyspark,apache-spark-sql,pyspark-sql,Python,Pyspark,Apache Spark Sql,Pyspark Sql,我有两个几乎相同的Pyspark数据帧:相同的行数和行id,相同的模式,但每行的某些列上的值不同 我想确定每行的那些列是什么 例如: 数据帧A id fname lname email 1 Michael Jackson mj@yahoo.com 2 Roger Moore rm@rocketmail.com 3 Angela Merkel am@dw.de 数据帧B id fname lname email 1 Michael Jordan

我有两个几乎相同的Pyspark数据帧:相同的行数和行id,相同的模式,但每行的某些列上的值不同

我想确定每行的那些列是什么

例如:

数据帧A

id  fname   lname   email
1   Michael Jackson mj@yahoo.com
2   Roger   Moore   rm@rocketmail.com
3   Angela  Merkel  am@dw.de
数据帧B

id  fname   lname   email
1   Michael Jordan  mj@yahoo.com
2   Gordon  Moore   rm@rocketmail.com
3   Angela  Markle  am@dw.com
预期输出是字典列表:

[ 
  {"1": ["lname"]}, 
  {"2": ["fname"] }, 
  {"3": ["lname", "email"] }
]

以下是使用RDD转换的更一般化的答案:

column_names = a_df.schema.names

def compare(row):
    diff_columns = []
    for col in column_names:
        if row[1][0][col] != row[1][1][col]:
            diff_columns.append(col)

    return ( row[0],  { row[0]: diff_columns } )

# convert to Pair RDD for joining
a_pair_rdd = a_df.rdd.map(lambda x: (x['id'], x))
b_pair_rdd = b_df.rdd.map(lambda y: (y['id'], y))
joined_rdd = a_pair_rdd.join(b_pair_rdd)

output = joined_rdd.map(compare).map(lambda pair: pair[1]).collect()