Pyspark SQL проблемы с условным присоединением - PullRequest
1 голос
/ 06 мая 2020

Я пытаюсь условно объединить эти два набора данных с помощью функции joinConditional ниже. Я нашел аналогичное описание для кода scala, но для Python я не могу заставить его работать. Он продолжает выдавать ошибку «Столбец не повторяется». Я новичок в Pyspark и мог бы использовать некоторую помощь.

Вот фрейм данных dfviol

+------+------+
|Number|Letter|
+------+------+
|     5|     a|
|     2|     b|
|     3|     c|
|     6|     a|
|     7|     b|
+------+------+

вот фрейм данных dfcent

+---+------+-----------------+------------------+------------------+-------------------+
| ID|Letter|Num_range_low_odd|Num_range_high_odd|Num_range_low_even|Num_range_high_even|
+---+------+-----------------+------------------+------------------+-------------------+
|  1|     a|                1|                 5|                 6|                 10|
|  2|     a|                7|                 9|                 0|                  4|
|  3|     a|               11|                15|                10|                 14|
|  4|     b|                1|                 5|                 0|                  4|
|  5|     b|                7|                 9|                 6|                 10|
|  6|     c|                1|                 5|                 0|                  4|
|  7|     c|                7|                 9|                 6|                 10|
|  8|     c|               11|                15|                10|                 14|
+---+------+-----------------+------------------+------------------+-------------------+

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

это то, что У меня так далеко, но говорится, что столбец не повторяется.

joinCondition = when(dfviol.Number%2== 0, [dfcent.Num_range_low_even <= dfviol.Number,dfcent.Num_range_high_even >= dfviol.Number]).otherwise([dfcent.Num_range_low_odd <= dfviol.Number,dfcent.Num_range_high_odd >= dfviol.Number])

df_full = dfviol.join(dfcent,[dfviol.Letter == dfcent.Letter, joinCondition], how='inner')
df_full.show()

Я не уверен, что я делаю неправильно, любая помощь будет fantasti c

1 Ответ

4 голосов
/ 06 мая 2020

Вы можете связать несколько условий с &.

from pyspark.sql.functions import when

joinCondition = when(dfviol.Number%2== 0, (dfcent.Num_range_low_even <= dfviol.Number)&(dfcent.Num_range_high_even >= dfviol.Number)).otherwise((dfcent.Num_range_low_odd <= dfviol.Number) & (dfcent.Num_range_high_odd >= dfviol.Number))

df_full = dfviol.join(dfcent,[dfviol.Letter == dfcent.Letter, joinCondition], how='inner')
df_full.show()

#+------+------+---+------+-----------------+------------------+------------------+-------------------+
#|Number|Letter| ID|Letter|Num_range_low_odd|Num_range_high_odd|Num_range_low_even|Num_range_high_even|
#+------+------+---+------+-----------------+------------------+------------------+-------------------+
#|     3|     c|  6|     c|                1|                 5|                 0|                  4|
#|     2|     b|  4|     b|                1|                 5|                 0|                  4|
#|     7|     b|  5|     b|                7|                 9|                 6|                 10|
#|     5|     a|  1|     a|                1|                 5|                 6|                 10|
#|     6|     a|  1|     a|                1|                 5|                 6|                 10|
#+------+------+---+------+-----------------+------------------+------------------+-------------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...