Заменить столбцы в фрейме данных pyspark после объединения - PullRequest
0 голосов
/ 14 апреля 2020

У меня есть 2 данных ниже. col_1 col_2 col_3 принадлежит фрейму данных 1, а col_4 col_5 и col_6 принадлежит фрейму данных 2. Соединение должно быть выполнено для col_1 из df1 и col_4 из df2 и его «левое» соединение

фрейм данных 1

col_1   col_2   col_3   col_3a
a       NA      NA      A
b       NA      NA      B
c       NA      NA      C
d       NA      NA      D

датафрейм 2

col_4   col_5   col_6
a       1       1
b       1       1
c       1       1

Выходной фрейм данных должен иметь формат:

col_1   col_2   col_3    col_3a
a       1       1        A
b       1       1        B
c       1       1        C
d       NA      NA       D

По существу, значения col_5 и col_6 должны быть заменены в фрейме данных 1 - col_2 и col_3, когда матч доступен. Я попытался с withcolumnrenamed и был не очень успешным.

Ответы [ 2 ]

1 голос
/ 14 апреля 2020

Решение, которое я имею в виду, состоит в том, чтобы объединить два набора данных с разными суффиксами и затем применить case_when. Решение не проверено.

Сначала выполните полное соединение: (в вашем примере достаточно левого соединения)

import pyspark.sql.functions as psf

df_join = (df1
            .join(df2, psf.col('col_1') == psf.col('col_4'), how = "full_outer")
            .drop("col_4")
           )

Я предположил, что вы хотели full join. Вы можете изменить при необходимости.

Затем вы используете условную замену на psf.when

df_join = df_join
    .withColumn("col_2",
            psf.when(psf.col('col_2').isNull(),
                     psf.col('col_5'))
                     )
                 )
    .withColumn("col_3",
            psf.when(psf.col('col_2').isNull(),
                     psf.col('col_6'))
                     )
                 )
1 голос
/ 14 апреля 2020

Используйте coalesce функцию для получения first not null значения из col_5, col_2 и col_6, col_3

Example:

df1.join(df2,df1.col_1 == df2.col_4,'left').\
selectExpr("col_1","coalesce(col_5,col_2) as col_2","coalesce(col_6,col_3) as col_3","col_3a").\
orderBy("col_1").\
show()
#+-----+-----+-----+------+
#|col_1|col_2|col_3|col_3a|
#+-----+-----+-----+------+
#|    a|    1|    1|     A|
#|    b|    1|    1|     B|
#|    c|    1|    1|     C|
#|    d|   NA|   NA|     D|
#+-----+-----+-----+------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...