gpt4 book ai didi

scala - 使用withColumn将两列添加到现有DataFrame

转载 作者:行者123 更新时间:2023-12-03 10:50:54 24 4
gpt4 key购买 nike

我有几列的DataFrame。现在,我想在现有的DataFrame中再添加两列。

目前,我正在使用DataFrame中的withColumn方法执行此操作。

,例如:

df.withColumn("newColumn1", udf(col("somecolumn")))
.withColumn("newColumn2", udf(col("somecolumn")))

实际上,我可以使用Array [String]在单个UDF方法中返回两个newcoOlumn值。但是目前这就是我的做法。

无论如何,我可以有效地做到这一点吗?在这里使用 explode是个不错的选择吗?

即使必须使用 explode,我也必须使用 withColumn一次,然后将列值返回为 Array[String],然后使用 explode,再创建两个列。

哪一个有效?还是有其他选择?

最佳答案

AFAIk,您需要调用withColumn两次(每个新列一次)。但是,如果您的udf在计算上比较昂贵,则可以避免将它的两次调用,方法是将“复杂”结果存储在临时列中,然后“解包”结果,例如使用列的apply方法(可访问数组元素)。请注意,有时有必要缓存中间结果(以防止在拆包过程中每行两次调用UDF),有时则不需要。这似乎取决于 Spark 如何优化计划:

val myUDf = udf((s:String) => Array(s.toUpperCase(),s.toLowerCase()))

val df = sc.parallelize(Seq("Peter","John")).toDF("name")

val newDf = df
.withColumn("udfResult",myUDf(col("name"))).cache
.withColumn("uppercaseColumn", col("udfResult")(0))
.withColumn("lowercaseColumn", col("udfResult")(1))
.drop("udfResult")

newDf.show()


+-----+---------------+---------------+
| name|uppercaseColumn|lowercaseColumn|
+-----+---------------+---------------+
|Peter| PETER| peter|
| John| JOHN| john|
+-----+---------------+---------------+

当UDF返回一个元组时,解压缩看起来像这样:
val newDf = df
.withColumn("udfResult",myUDf(col("name"))).cache
.withColumn("lowercaseColumn", col("udfResult._1"))
.withColumn("uppercaseColumn", col("udfResult._2"))
.drop("udfResult")

关于scala - 使用withColumn将两列添加到现有DataFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40959655/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com