将字符串(或字符串列表)拆分为 spark 数据框中的各个列

Posted

技术标签:

【中文标题】将字符串(或字符串列表)拆分为 spark 数据框中的各个列【英文标题】:Split String (or List of Strings) to individual columns in spark dataframe 【发布时间】:2017-01-27 19:31:00 【问题描述】:

给定一个数据框“df”和一个列列表“colStr”,Spark Dataframe 中是否有办法从数据框中提取或引用这些列。

这是一个例子 -

val in = sc.parallelize(List(0, 1, 2, 3, 4, 5))
val df = in.map(x => (x, x+1, x+2)).toDF("c1", "c2", "c3")
val keyColumn = "c2" // this is either a single column name or a string of column names delimited by ','
val keyGroup = keyColumn.split(",").toSeq.map(x => col(x))

import org.apache.spark.sql.expressions.Window
import sqlContext.implicits._

val ranker = Window.partitionBy(keyGroup).orderBy($"c2")

val new_df= df.withColumn("rank", rank.over(ranker))

new_df.show()

上面的错误用

error: overloaded method value partitionBy with alternatives
(cols:org.apache.spark.sql.Column*)org.apache.spark.sql.expressions.WindowSpec <and>
(colName: String,colNames: String*)org.apache.spark.sql.expressions.WindowSpec
cannot be applied to (Seq[org.apache.spark.sql.Column])

感谢您的帮助。谢谢!

【问题讨论】:

【参考方案1】:

如果您尝试按keyGroup 列表中的列对数据框进行分组,您可以将keyGroup: _* 作为参数传递给partitionBy 函数:

val ranker = Window.partitionBy(keyGroup: _*).orderBy($"c2")    
val new_df= df.withColumn("rank", rank.over(ranker))

new_df.show
+---+---+---+----+
| c1| c2| c3|rank|
+---+---+---+----+
|  0|  1|  2|   1|
|  5|  6|  7|   1|
|  2|  3|  4|   1|
|  4|  5|  6|   1|
|  3|  4|  5|   1|
|  1|  2|  3|   1|
+---+---+---+----+

【讨论】:

想知道为什么投反对票,这对我来说也是正确的答案。 @PascalSoucy 我也不知道,尤其是在这种情况下,如果否决的选民没有发表评论。我会保持原样,因为我不知道为什么它是错误的。不过感谢您的评论。

以上是关于将字符串(或字符串列表)拆分为 spark 数据框中的各个列的主要内容,如果未能解决你的问题,请参考以下文章

将 Spark Dataframe 字符串列拆分为多列

将 Spark Dataframe 字符串列拆分为多列

如何基于多个空格字符将文本文件拆分为 2 列作为 scala spark 的分隔符

将列表的 spark DF 列拆分为单独的列

如何在 Spark Scala 数据框中拆分逗号分隔的字符串并获取 n 个值?

将字符串拆分为列表并将项目转换为 int