加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 09:29:09 所属栏目:安全 来源:网络整理
导读:我有一个包含很少列的DataFrame.现在我想再向现有的DataFrame添加两列. 目前我正在使用DataFrame中的withColumn方法执行此操作. 例如: df.withColumn("newColumn1",udf(col("somecolumn"))) .withColumn("newColumn2",udf(col("somecolumn"))) 实际上我可以
我有一个包含很少列的DataFrame.现在我想再向现有的DataFrame添加两列.

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

例如:

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

实际上我可以使用Array [String]在单个UDF方法中返回两个新的COlumn值.但目前我正是这样做的.

无论如何,我能有效地做到这一点吗?使用爆炸是不错的选择?

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

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

解决方法

您需要两次调用AFAIk(每个新列一次).但是如果你的udf计算量很大,你可以避免在将“复杂”结果存储到临时列中然后“解压缩”结果时将其调用两次.使用column的apply方法(可以访问数组元素):

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")))
  .withColumn("uppercaseColumn",col("udfResult")(0))
  .withColumn("lowercaseColumn",col("udfResult")(1))
  .drop("udfResult")

newDf.show()

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

我经常这样做,但不使用数组,而是使用案例类或元组作为udf的结果

编辑:

使用UDF返回元组,解压缩将如下所示:

val newDf = df
    .withColumn("udfResult",myUDf(col("name")))
    .withColumn("lowercaseColumn",col("udfResult._1"))
    .withColumn("uppercaseColumn",col("udfResult._2"))
    .drop("udfResult")

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读