我正在编写一个函数来输出具有两个数据帧之间差异的数据帧。简化后,它看起来像这样:
differences = df1.join(df2, df1['id'] == df2['id'], how='full') \
.select(F.coalesce(df1['id'], df2['id']).alias('id'), df1['name'], df2['name'])
.where(df1['name'] != df2['name'])
对于以下 2 个数据集,我希望第 3 个数据集是输出:
+---+-----+
| id| name|
+---+-----+
| 1|Alice|
| 2| Bob|
| 3|Carol|
| 4| Dan|
| 5| Eve|
+---+-----+
+---+-----+
| id| name|
+---+-----+
| 1|Alice|
| 2| Ben|
| 4| Dan|
| 5| Eve|
| 6| Finn|
+---+-----+
+---+-------+-------+
|age| name| name|
+---+-------+-------+
| 2| Bob| Ben|
| 3| Carol| null|
| 6| null| Finn|
+---+-------+-------+
但是当我在数据 block 中运行它时,结果数据框中省略了空列。
+---+-------+-------+
|age| name| name|
+---+-------+-------+
| 2| Bob| Ben|
+---+-------+-------+
where 子句不考虑 != 吗?创建这些框架时是否有隐藏的逻辑?
最佳答案
来自 Why [table].[column] != null is not working? :
“数据库中的 NULL 不是值。它的意思是“未知”或“数据丢失”。
您无法判断您没有任何信息的事物是否等于您也没有任何信息(=、!= 运算符)的事物。但是你可以说是否有任何可用的信息(IS NULL,IS NOT NULL)。”
因此您将不得不添加更多条件:
differences = df1.join(df2, df1['id'] == df2['id'], how='full')\
.select(F.coalesce(df1['id'], df2['id']).alias('id'), df1['Name'], df2['Name'])\
.where((df1['Name'] != df2['Name']) | ((df1['Name']).isNull() | (df2['Name']).isNull()))
+---+-----+----+
|id |Name |Name|
+---+-----+----+
|2 |Bob |Ben |
|3 |Carol|null|
|6 |null |Finn|
+---+-----+----+
关于dataframe - Pyspark Dataframe 差异 - param != null 不返回的地方?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69858946/