2016-08-03 83 views
0

我正在使用Spark 1.5.2与Python3。我在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 

,我想出了是先连接两个dataframes然后执行dropduplicates的解决方案。

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

但是,让我失望,星火未执行“滴”的行动,这就造成了错误的数据帧时,保持第一的纪录。

是否有任何解决它的方法?或者以其他方式完成工作?

+0

您的示例适用于我,您的解决方案出了什么问题? –

+0

'dropduplicates'操作似乎随机丢弃重复的记录。这种行为似乎取决于Spark版本。我的解决方案适用于Spark 1.6.2,但在Spark 1.5.2上失败。 –

回答

0

可以使用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") 

此断言,新的排名总是在最后的DF。

+0

是的,'when'子句起作用。谢谢。 –