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

Posted dqz_nihao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于Spark dataframe 中某几列合并成vector或拆分的主要内容,如果未能解决你的问题,请参考以下文章

sql 查询 一个表中某几列数据

SQL语句怎么实现几列数据合并成一条??

pandas将dataframe中的年月日数据列合并成完整日期字符串并使用to_datetime将字符串格式转化为日期格式

SQL怎么列合并

在winform中,如何将DataGridView中某几列的数值设置成文字,及显示文字,后台传递的是数字。

pandas提取DataFrame数据集中某几列