Как перезаписать два кадра данных, чтобы получить результат, как показано ниже - PullRequest
0 голосов
/ 09 мая 2019

У меня есть два фрейма данных DF1 и DF2 через pyspar. Я хочу вывод, как показано ниже:

DF1

Id|field_A   |field_B   |field_C |field_D
1 |cat       |12        |black   |1
2 |dog       |128       |white   |2

DF2

Id|field_A|field_B|field_C
1 |cat    |13     |blue

Требуется вывод:

DF3

Id|field_A|field_B|field_C|field_D
1 |cat    |13     |blue   |1
2 |dog    |128    |white  |2

Я пробовал использовать концепцию объединения, но она не работает при следующих соединениях.

'внутренний', 'внешний', 'полный', 'fullouter', 'full_outer', 'leftouter', 'left', 'left_outer', 'rightouter', 'right', 'right_outer', 'leftsemi', 'left_semi', 'leftanti', 'left_anti', 'cross'

DF3 = DF2.join(DF1, DF1.ID == DF2.ID,"leftouter")

1 Ответ

0 голосов
/ 10 мая 2019

Сначала необходимо объявить псевдоним для кадров данных:

val a = df1.as("a")
val b = df2.as("b")

Создать массив со столбцами, которые не были обновлены

val columnsNotUpdated =
        Seq(col("a.Id").as("Id"), col("a.field_D").as("field_D"))

Создать массив с обновленными столбцами, ииспользуйте, когда нужно увидеть, пересекается ли он (b.Id не равен NULL) с фреймом данных b, и, если он пересекается, выберите значение фрейма данных 'b'

 val columnsUpdated = a.columns
        .filter(x => !Array("Id", "field_D").exists(_ == x))
        .map(x =>
          when(col("b.Id").isNotNull, col(f"b.$x").as(x))
            .otherwise(col(f"a.$x").as(x)))

Наконец, объедините с помощью left_outer и выберитестолбцы

a.join(b, col("a.Id") === col("b.Id"), "left_outer")
        .select(columnsNotUpdated.union(columnsUpdated): _*)

Весь код:

val a = df1.as("a")
      val b = df2.as("b")

      val columnsNotUpdated =
        Seq(col("a.Id").as("Id"), col("a.field_D").as("field_D"))

      val columnsUpdated = a.columns
        .filter(x => !Array("Id", "field_D").exists(_ == x))
        .map(x =>
          when(col("b.Id").isNotNull, col(f"b.$x").as(x))
            .otherwise(col(f"a.$x").as(x)))

      a.join(b, col("a.Id") === col("b.Id"), "left_outer")
        .select(columnsNotUpdated.union(columnsUpdated): _*)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...