加入后如何更新Spark Scala中的dataframe列?

时间:2018-09-05 18:33:33

标签: scala apache-spark apache-spark-sql

两个数据帧的合并结果将近60列。他们中的大多数人假设保持原样,但有些人需要根据其他列中的值进行更新。有没有一种方法可以不计算新列而更新,删除原始列并重命名计算后的列呢?

一个简化的示例:来自左侧数据框的$"Sales列中的收入应由联接结果中的$"Weight加权。是否有一种有效的方法来使计算不生成$"SalesWeighted作为新列,将原始$Sales删除并将$SalesWeighted重命名为$Sales? >

val l = Seq((1, 50), (2, 35), (3, 66))
            .toDF("Id", "Sales")

val r = Seq((1, "Premium", 0.2), (1, "Standard", 0.8), 
            (2, "Premium", 0.4), (2, "Standard", 0.6), 
            (3, "Premium", 0.333), (3, "Standard", 0.333), (3, "Garbage", 0.334))
            .toDF("Id", "Grade", "Weight")

display(l.join(r, Seq("Id")).withColumn("SalesWeighted", $"Sales"*$"Weight")
            .orderBy($"Id", $"Grade"))

1 个答案:

答案 0 :(得分:1)

使用拖放删除不必要的列

val l = Seq((1, 50), (2, 35), (3, 66))
                .toDF("Id", "Sales")

    val r = Seq((1, "Premium", 0.2), (1, "Standard", 0.8), 
                (2, "Premium", 0.4), (2, "Standard", 0.6), 
                (3, "Premium", 0.333), (3, "Standard", 0.333), (3, "Garbage", 0.334))
                .toDF("Id", "Grade", "Weight")

    display(l.join(r, Seq("Id")).withColumn("SalesWeighted", $"Sales"*$"Weight").drop($"Sales")
                .orderBy($"Id", $"Grade"))