Spark dataframe 中某几列合并成vector或拆分

使用Spark SQL在对数据进行处理的过程中,可能会遇到对一列数据拆分为多列,或者把多列数据合并为一列。这里记录一下目前想到的对DataFrame列数据进行合并和拆分的几种方法。

1 DataFrame列数据的合并
例如:我们有如下数据,想要将三列数据合并为一列,并以“,”分割

±—±–±----------+
|name|age| phone|
±—±–±----------+
|Ming| 20|15552211521|
|hong| 19|13287994007|
| zhi| 21|15552211523|
±—±–±----------+

1.1 使用map方法重写
使用map方法重写就是将DataFrame使用map取值之后,然后使用toSeq方法转成Seq格式,最后使用Seq的foldLeft方法拼接数据,并返回,如下所示:

//方法1:利用map重写
val separator = “,”
df.map( _.toSeq.foldLeft(“”)( _ + separator + _).substring(1)).show()

    /**
      * +-------------------+
      * |              value|
      * +-------------------+
      * |Ming,20,15552211521|
      * |hong,19,13287994007|
      * | zhi,21,15552211523|
      * +-------------------+
      */

1.2 使用内置函数concat_ws
合并多列数据也可以使用SparkSQL的内置函数concat_ws()

 //方法2: 使用内置函数 concat_ws
    import org.apache.spark.sql.functions._
    df.select(concat_ws(separator, $"name", $"age", $"phone").cast(StringType).as("value")).show()

/**
  * +-------------------+
  * |              value|
  * +-------------------+
  * |Ming,20,15552211521|
  * |hong,19,13287994007|
  * | zhi,21,15552211523|
  * +-------------------+
  */

1.3 使用自定义UDF函数
自己编写UDF函数,实现多列合并

//方法3:使用自定义UDF函数

// 编写udf函数
def mergeCols(row: Row): String = {
  row.toSeq.foldLeft("")(_ + separator + _).substring(1)
}

val mergeColsUDF = udf(mergeCols _)
df.select(mergeColsUDF(struct($"name", $"age", $"phone")).as("value")).show()

原文链接:https://blog.csdn.net/shirukai/article/details/82665733

1.4 使用VectorAssembler

在这里插入图片描述

在这里插入图片描述

2 拆永久用split

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值