Объединение 2-х фреймов данных pysaprk и удаление дублирующих строк из объединения - PullRequest
1 голос
/ 08 июля 2019

Я пытаюсь объединить 2 фрейма данных pyspark по 2 столбцам, фреймы данных:

df1 = pd.DataFrame()
df1["ID"] = ["1","1","2","5"]
df1["A"] = ["100","100","300","450"]
df1["Date"] = [2015,2019,2002,2003]
df1["Date2"] = [2000,2000,2000,2000]
df1 = sqlContext.createDataFrame(df1)

df2 = pd.DataFrame()
df2["ID"] = ["1","1","5","9"]
df2["A"] = ["100","100","450","250"]
df2["Z"] = [65,65,65,65]
df2 = sqlContext.createDataFrame(df2)

df1:

+---+---+----+-----+
| ID|  A|Date|Date2|
+---+---+----+-----+
|  1|100|2015| 2000|
|  1|100|2019| 2000|
|  2|300|2002| 2000|
|  5|450|2003| 2000|
+---+---+----+-----+

df2:

+---+---+---+
| ID|  A|  Z|
+---+---+---+
|  1|100| 65|
|  1|100| 65|
|  5|450| 65|
|  9|250| 65|
+---+---+---+

Я хочу получить следующий фрейм данных:

+---+---+----+-----+----+
| ID|  A|Date|Date2|   Z|
+---+---+----+-----+----+
|  9|250|null| null|  65|
|  5|450|2003| 2000|  65|
|  1|100|2015| 2000|  65|
|  1|100|2019| 2000|  65|
|  2|300|2002| 2000|null|
+---+---+----+-----+----+

Я пытался:

new = df1.join(df2, ["ID","A"],how='full' )

Что мне достанется:

+---+---+----+-----+----+
| ID|  A|Date|Date2|   Z|
+---+---+----+-----+----+
|  9|250|null| null|  65|
|  5|450|2003| 2000|  65|
|  2|300|2002| 2000|null|
|  1|100|2015| 2000|  65|
|  1|100|2015| 2000|  65|
|  1|100|2019| 2000|  65|
|  1|100|2019| 2000|  65|
+---+---+----+-----+----+

Затем я удалил дубликаты, используя:

cols_join = new.columns
cols_join.remove("ID")
cols_join.remove("A")

new.dropDuplicates(subset=cols_join).show()

+---+---+----+-----+----+
| ID|  A|Date|Date2|   Z|
+---+---+----+-----+----+
|  9|250|null| null|  65|
|  5|450|2003| 2000|  65|
|  1|100|2015| 2000|  65|
|  1|100|2019| 2000|  65|
|  2|300|2002| 2000|null|
+---+---+----+-----+----+

Есть ли лучший способ сделать это?

Я пробовал другие объединения (левый, внутренний и т. Д.), Но не получил желаемый результат

Кроме того, есть ли лучший способ удаления дублированных строк?

1 Ответ

0 голосов
/ 12 июля 2019

В этом случае полное объединение является обязательным, так как в результирующем информационном кадре есть ID, A от df1 и df2.

Таким образом, другие типы объединения (левый, левый-полуприцеп ...) не включены.

Я не думаю, что что-то может сделать для повышения производительности.

для упрощения кода, вы можете просто использовать

new.dropDuplicates(['Date', 'Date2', 'Z'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...