Size: a a a

2020 November 13

ИК

Иван Калининский... in Data Engineers
Таки один джоин это не опишет, действительно
источник

ИК

Иван Калининский... in Data Engineers
Но уже есть вариант с union all, это ближе к желаемому
источник

AZ

Anton Zadorozhniy in Data Engineers
даже не поленился в базу загрузить, мой запрос действительно возвращает 6 строк, но двух пустых а1/а4 недостает
источник

AZ

Anton Zadorozhniy in Data Engineers
(извините, пишу в том что открыто в соседнем окне)
источник

AZ

Anton Zadorozhniy in Data Engineers
а, пардон, неправильно вставил
источник

ИК

Иван Калининский... in Data Engineers
Aleksandr
Всем привет. Есть два датасета, например:
A    B   C 
A1  B1   C1
A2  B2   C2
A3  B3   C3

A  D
A1 D1
A4 D4

я делаю по ним full outer join спарком по колонке "A":
first.join(second, Seq("A"), "full_outer")
Результат, очевидно, получаю вот такой:
+---+----+----+----+
|  A|   B|   C|   D|
+---+----+----+----+
| A1|  B1|  C1|  D1|
| A2|  B2|  C2|null|
| A3|  B3|  C3|null|
| A4|null|null|  D4|
+---+----+----+----+
Теперь вопрос - как спарком поизящнее сделать такой же джойн, но для каждого конкретного значения в колонке A? Или без select distinct и затем fold не получится? Пример результата:
+---+----+----+----+
|  A|   B|   C|   D|
+---+----+----+----+
| A1|  B1|  C1|  D1|
| A4|null|null|  D4|  <- full outer join A1 values with second dataset

| A1|null|null|  D1|
| A2|  B2|  C2|null|
| A4|null|null|  D4|   <- full outer join A2 values with second dataset

| A1|null|null|  D1|
| A3|  B3|  C3|null|   <- full outer join A3 values with second dataset
| A4|null|null|  D4|
+---+----+----+----+
Готово
Запрос из двух частей
Первая часть стандартный full outer join
Вторая - nonEquiJoin, соединение по условию df1("A") =!=df2("A"), поля B и C замещены null
Соединяются unionByName
источник

ИК

Иван Калининский... in Data Engineers
Если непонятно, могу написать SQL или dataframe API, но не прямо сейчас, пятница всё же))
источник

A

Aleksandr in Data Engineers
окей, спасибо. сейчас попробую сам через df api сделать, что вы описали
источник

ИК

Иван Калининский... in Data Engineers
Aleksandr
окей, спасибо. сейчас попробую сам через df api сделать, что вы описали
Пожалуйста, добавил про unionByName
источник

A

Aleksandr in Data Engineers
Иван Калининский
Пожалуйста, добавил про unionByName
первый ответ на стековерфлоу
Unequal join is not recommended for spark join
:D . На самом деле, первый раз про unequal join слышу, интересно.
источник

AZ

Anton Zadorozhniy in Data Engineers
Иван Калининский
Готово
Запрос из двух частей
Первая часть стандартный full outer join
Вторая - nonEquiJoin, соединение по условию df1("A") =!=df2("A"), поля B и C замещены null
Соединяются unionByName
второй джоин даст 5 строк, всего 9, а надо 8
источник

ИК

Иван Калининский... in Data Engineers
Anton Zadorozhniy
второй джоин даст 5 строк, всего 9, а надо 8
Вот что пятница делает. В первой части left join
источник

ИК

Иван Калининский... in Data Engineers
Aleksandr
первый ответ на стековерфлоу
Unequal join is not recommended for spark join
:D . На самом деле, первый раз про unequal join слышу, интересно.
Ну, это уже тонкости реализации, тюнинг, можно на графы перейти
источник

AZ

Anton Zadorozhniy in Data Engineers
Иван Калининский
Вот что пятница делает. В первой части left join
да, так работает
sel coalesce(t1.a, t2.a) a, t1.b, t1.c, t2.d
from t1
left join t2
on t1.a = t2.a
union all
sel t2.a, cast(null as char(2)) b, cast(null as char(2)) c, t2.d
from t1
join t2
on not(t1.a = t2.a)
источник

AZ

Anton Zadorozhniy in Data Engineers
источник

AZ

Anton Zadorozhniy in Data Engineers
но я логику убей не пойму, надо прям постараться
источник

A

Aleksandr in Data Engineers
спасибо! ща пойду шо нибудь попробую
источник

AZ

Anton Zadorozhniy in Data Engineers
Aleksandr
первый ответ на стековерфлоу
Unequal join is not recommended for spark join
:D . На самом деле, первый раз про unequal join слышу, интересно.
это хороший индикатор не только в спарке, если нужен такой джоин (или кросс джоин) по нетривиальным объемам данных (с двух сторон) то явно что-то не то со схемой, с логикой или с тем и другим
источник

VS

Vasily Shabanov in Data Engineers
sel coalesce(t1.a, t2.a) a, t1.b, t1.c, t2.d
from t1
left join t2
on t1.a = t2.a

Тут вроде как coalesce не нужен. В t1 всегда заполнен «a»
источник

AZ

Anton Zadorozhniy in Data Engineers
Vasily Shabanov
sel coalesce(t1.a, t2.a) a, t1.b, t1.c, t2.d
from t1
left join t2
on t1.a = t2.a

Тут вроде как coalesce не нужен. В t1 всегда заполнен «a»
копипаста из фулл джоина, точно
источник