将字符串(或字符串列表)拆分为 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 数据框中的各个列的主要内容,如果未能解决你的问题,请参考以下文章
如何基于多个空格字符将文本文件拆分为 2 列作为 scala spark 的分隔符