scala - Внешнее объединение в 2 столбцах кадра данных не показывает строки, в которых есть нулевые значения - PullRequest
0 голосов
/ 07 января 2019

Я присоединяюсь к двум фреймам данных примерно так: 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()

Я получаю следующий фрейм данных:

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

Как я могу заставить свой оператор фильтра отображать нулевые значения в конечном кадре данных

1 Ответ

0 голосов
/ 07 января 2019

Причина, по которой вы не получаете строк, в которых есть 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 (=) для ненулевых операндов, но возвращает true, если оба имеют значение null, и false, если один из них равен null.

Аргументы:

expr1, expr2 - два выражения должны быть одного типа или могут быть приведены к общему типу, и должны быть типом, который можно использовать при сравнении на равенство. Тип карты не поддерживается. Для сложных типов, таких как массив / структура, типы данных полей должны быть упорядочены. Примеры:

ВЫБРАТЬ 2 <=> 2; правда

SELECT 1 <=> '1'; правда

SELECT true <=> NULL; ложь

ВЫБЕРИТЕ NULL <=> NULL; правда

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...