Я пытался объединить таблицы для комбинации трех переменных в качестве уникального ключа соединения (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|
+------------------+--------------+----------+----+-------+------------------+--------------+----------+----+-------+