Как частично обновить спарк-фрейм данных (обновить несколько строк)
Я использую 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")
Это утверждает, что новый ранг всегда в финале.