Как частично обновить спарк-фрейм данных (обновить несколько строк)

Я использую Spark 1.5.2 с Python3. У меня есть два dataframes в pyspark. Они похожи:

old_df = 

src | rank
------ | ------
  a|   1
  b|   1
  c|   1
  d|   1
  e|   1
  f|   1
  g|   1

а также

new_df = 
src|              rank
---|-----------------
  a|               0.5
  b|0.3333333333333333
  c|1.6666666666666665
  d|               1.5

Теперь я хочу обновить некоторые строки в old_df с новыми ценностями в new_df, Моя цель - создать новый фрейм данных, который выглядит следующим образом:

  src | rank
------ | ------
  a|               0.5
  b|0.3333333333333333
  c|1.6666666666666665
  d|               1.5
  e|   1
  f|   1
  g|   1

Решение, которое я нашел, состоит в том, чтобы сначала объединить два кадра данных, а затем выполнить dropduplicates,

new_df = new_df.unionAll(old_df).dropDuplicates(['src'])

Однако, к моему разочарованию, Spark не сохранил первую запись при выполнении действия "drop", которое привело к неверному фрейму данных.

Есть ли подход, чтобы это исправить? Или какой-нибудь альтернативный способ сделать работу?

1 ответ

Вы можете решить это с помощью функций sql и присоединиться..

import org.apache.spark.sql.funtions._

odl_df.join(new_df, "src")
  .withColumn("finalRank",
         when(new_df("rank").isNull, odl_df("rank"))
          .otherwise(new_df("rank"))
  .drop(new_df("rank"))
  .drop(odl_df("rank"))
  .withColumnRenamed("finalRank", "rank")

Это утверждает, что новый ранг всегда в финале.

Другие вопросы по тегам