dataframe - Pyspark Dataframe 差异 - param != null 不返回的地方?

标签 dataframe apache-spark join pyspark

我正在编写一个函数来输出具有两个数据帧之间差异的数据帧。简化后,它看起来像这样:

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/

相关文章:

用向量的第 i 个元素替换在列 i 中找到的矩阵/数据帧值

html - 将 pandas 数据框导出到 HTML 中的可排序表格

java - Spark Dataframe 在指定架构时返回 NULL

json - 斯卡拉 : How to do GroupBy sum for String values?

php - 通过 SQL 左连接对另一个左连接进行排序

sql - 如果有代理键,需要单独的表吗?

python - 添加一列,其中填充的值对应于第三列中每个值的另一列中的最大值

python - 值错误 : Must specify a fill 'value' or 'method'

scala - 为什么在 Spark 中传递格式错误的时区字符串时 from_utc_timstamp 不抛出错误?

mysql - 将两个查询合并为一个