标量-2个数据框列上的外部联接不显示存在空值的行

时间:2019-01-07 01:06:38

标签: scala apache-spark dataframe

我加入了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语句使空值出现在最终数据框中

1 个答案:

答案 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;     是