Соединение таблиц по нулевым ключам - PullRequest
0 голосов
/ 11 февраля 2019

Я пытался объединить таблицы для комбинации трех переменных в качестве уникального ключа соединения (application_number, application_dt и account_id).

account_id может принимать нулевые значения, но объединение все равно должно работать, сравниваядругие два ключа, поэтому я использую coalesce over account_id, чтобы заменить его на 0, если Null.

Это работало для моих таблиц, но я обнаружил еще одну странную проблему.

При попытке объединить данныеобрамляя себя, я увидел, что он игнорировал account_id при создании соединения, поэтому в моей таблице было дублирование.

Не могу найти причину, почему это не должно работать.

data1 = [[1,'2018-07-31',215,'a'],
     [2,'2018-07-30',None,'b'],
     [1,'2018-07-31',123,'c'],
     ]
df_1 = sqlCtx.createDataFrame(data1, 
['application_number','application_dt','account_id','Var1'])
df_1 = df_1.withColumn('new_var',F.coalesce(df_1.account_id,F.lit(0)))
df_2 = df_1

join_elem = "df_1.application_number == 
df_2.application_number|df_1.application_dt == 
df_2.application_dt|F.coalesce(df_1.account_id,F.lit(0)) == 
F.coalesce(df_2.account_id,F.lit(0))".split("|")
join_elem_column = [eval(x) for x in join_elem]

new = df_1.join(df_2,join_elem_column,'left')

Объединенный фрейм данных выглядит следующим образом:

+------------------+--------------+----------+----+-------+------------------+--------------+----------+----+-------+
|application_number|application_dt|account_id|Var1|new_var|application_number|application_dt|account_id|Var1|new_var|
+------------------+--------------+----------+----+-------+------------------+--------------+----------+----+-------+
|                 1|    2018-07-31|       215|   a|    215|                 1|    2018-07-31|       215|   a|    215|
|                 1|    2018-07-31|       215|   a|    215|                 1|    2018-07-31|       123|   c|    123|
|                 1|    2018-07-31|       123|   c|    123|                 1|    2018-07-31|       215|   a|    215|
|                 1|    2018-07-31|       123|   c|    123|                 1|    2018-07-31|       123|   c|    123|
|                 2|    2018-07-30|      null|   b|      0|                 2|    2018-07-30|      null|   b|      0|

Где, как будто я пытаюсь:

join_elem = "df_1.application_number == df_2.application_number|df_1.application_dt == df_2.application_dt|df_1.new_var == df_2.new_var".split("|")
join_elem_column = [eval(x) for x in join_elem]

new = df_1.join(df_2,join_elem_column,'left')

Результаты выглядят так:

------------------+--------------+----------+----+-------+------------------+--------------+----------+----+-------+
|application_number|application_dt|account_id|Var1|new_var|application_number|application_dt|account_id|Var1|new_var|
+------------------+--------------+----------+----+-------+------------------+--------------+----------+----+-------+
|                 1|    2018-07-31|       215|   a|    215|                 1|    2018-07-31|       215|   a|    215|
|                 1|    2018-07-31|       123|   c|    123|                 1|    2018-07-31|       123|   c|    123|
|                 2|    2018-07-30|      null|   b|      0|                 2|    2018-07-30|      null|   b|      0|
+------------------+--------------+----------+----+-------+------------------+--------------+----------+----+-------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...