Scala отфильтровывает строки в объединенном df на основе 2 столбцов с одинаковыми значениями - лучший способ - PullRequest
0 голосов
/ 06 января 2019

Я сравниваю 2 кадра данных. Я хочу сравнить их столбец за столбцом

Я создал 2 меньших кадра данных из родительских данных. на основе столбцов соединения и столбцов сравнения:

Created 1st dataframe:
val df1_subset = df1.select(subset_cols.head, subset_cols.tail: _*)

+----------+---------+-------------+
|first_name|last_name|loyalty_score|
+----------+---------+-------------+
|      tom |   cruise|           66|
|    blake |   lively|           66|
|       eva|    green|           44|
|      brad|     pitt|           99|
|     jason|    momoa|           34|
|   george |  clooney|           67|
|        ed|  sheeran|           88|
|    lionel|    messi|           88|
|      ryan| reynolds|           45|
|     will |    smith|           67|
|      null|     null|             |
+----------+---------+-------------+

Created 2nd Dataframe:
val df1_1_subset = df1_1.select(subset_cols.head, subset_cols.tail: _*)

+----------+---------+-------------+
|first_name|last_name|loyalty_score|
+----------+---------+-------------+
|      tom |   cruise|           34|
|      brad|     pitt|           78|
|       eva|    green|           56|
|      tom |   cruise|           99|
|     jason|    momoa|           34|
|   george |  clooney|           67|
|   george |  clooney|           88|
|    lionel|    messi|           88|
|      ryan| reynolds|           45|
|     will |    smith|           67|
|      kyle|   jenner|           56|
|    celena|    gomez|            2|
+----------+---------+-------------+

Тогда я присоединился к 2 подмножествам Я присоединился к ним как к полному внешнему соединению, чтобы получить следующее:

val df_subset_joined = df1_subset.join(df1_1_subset, joinColsArray, "full_outer")

Joined Subset
+----------+---------+-------------+-------------+
|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|           45|
+----------+---------+-------------+-------------+

Затем я попытался отфильтровать элементы, которые являются одинаковыми в обоих столбцах сравнения (в этом примере loyalty_scores), используя позиции столбцов

df_subset_joined.filter(_c2 != _c3).show

Но это не сработало. Я получаю следующую ошибку:

Error:(174, 33) not found: value _c2
df_subset_joined.filter(_c2 != _c3).show

Какой для меня наиболее эффективный способ получить объединенный фрейм данных, в котором я вижу только те строки, которые не совпадают в столбцах сравнения.

Я бы хотел сохранить эту динамику, чтобы жестко кодировать имена столбцов нельзя.

Спасибо, что помогли мне понять это.

1 Ответ

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

вам нужно работать с псевдонимами и использовать нулевой оператор сравнения (https://spark.apache.org/docs/latest/api/sql/index.html#_9), см. Также https://stackoverflow.com/a/54067477/1138523

val df_subset_joined = df1_subset.as("a").join(df1_1_subset.as("b"), joinColsArray, "full_outer")

df_subset_joined.filter(!($"a.loyality_score" <=> $"b.loyality_score")).show

РЕДАКТИРОВАТЬ: для динамических имен столбцов, вы можете использовать интерполяцию строк

import org.apache.spark.sql.functions.col
val xxx : String = ???

df_subset_joined.filter(!(col(s"a.$xxx") <=> col(s"b.$xxx"))).show
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...