我加入了2个数据框,如下所示: val joinCols = Array(“ first_name”,“ last_name”) val df_subset_joined = df1_subset.as(“ a”)。join(df2_subset.as(“ b”),joinCols,“ full_outer”) df_subset_joined.show()
这是上面代码的结果:
Dataframe of differences between 2 dataframes
+----------+---------+-------------+-------------+
|first_name|last_name|loyalty_score|loyalty_score|
+----------+---------+-------------+-------------+
| will | smith| 67| 67|
| george | clooney| 67| 67|
| george | clooney| 67| 88|
| blake | lively| 66| null|
| celena| gomez| null| 2|
| eva| green| 44| 56|
| null| null| | null|
| jason| momoa| 34| 34|
| ed| sheeran| 88| null|
| lionel| messi| 88| 88|
| kyle| jenner| null| 56|
| tom | cruise| 66| 34|
| tom | cruise| 66| 99|
| brad| pitt| 99| 78|
| ryan| reynolds| 45| null|
+----------+---------+-------------+-------------+
如您所见,存在具有空值的列。
我接下来运行以下代码:
val filter_str = s"a.$col"+" != "+s"b.$col"
val df_subset_filtered = df_subset_joined.filter(filter_str)
df_subset_filtered.show()
我得到了foll数据框:
Below is the dataframe of differences between DF1 and DF1 based on the comparison between:
a.loyalty_score != b.loyalty_score
+----------+---------+-------------+-------------+
|first_name|last_name|loyalty_score|loyalty_score|
+----------+---------+-------------+-------------+
| tom | cruise| 66| 99|
| tom | cruise| 66| 34|
| eva| green| 44| 56|
| brad| pitt| 99| 78|
| george | clooney| 67| 88|
+----------+---------+-------------+-------------+
为什么我看不到第一列中有空值而另一列中有实际值的行。这不应该满足值!= null
如何使我的filter语句使空值出现在最终数据框中
答案 0 :(得分:1)
一列中没有null
而另一列中有non-null
的任何行都没有,这是因为比较返回了FALSE
。
为避免这种情况,请将空安全比较运算符<=>
与not
结合使用。
val filter_str = "not(" + s"a.$col"+" <=> "+s"b.$col)"
val df_subset_filtered = df_subset_joined.filter(filter_str)
df_subset_filtered.show()
从文档中
expr1 <=> expr2-对于非空操作数,返回与EQUAL(=)运算符相同的结果,但如果两者均为null,则返回true,如果其中之一为null,则返回false。
参数:
expr1,expr2-这两个表达式必须是相同类型或可以强制转换为公共类型,并且必须是可用于相等比较的类型。不支持地图类型。对于复杂的类型(例如数组/结构),字段的数据类型必须可排序。 例子:
选择2 <=> 2; 是
SELECT 1 <=>'1'; 是
SELECT true <=> NULL; 错误
SELECT NULL <=> NULL; 是