我有记录为字符串,其中1000个字段的分隔符为数据框中的逗号,如
" a,b,c,d,e .......高达1000"第-1条记录 " p,q,r,s,t ......高达1000" - 第二条记录
我在stackoverflow
中使用以下建议的解决方案Split 1 column into 3 columns in spark scala
df.withColumn("_tmp", split($"columnToSplit", "\\.")).select($"_tmp".getItem(0).as("col1"),$"_tmp".getItem(1).as("col2"),$"_tmp".getItem(2).as("col3")).drop("_tmp")
然而在我的情况下,我有1000列我在JSON架构,我可以像
一样column_seq:Seq[Array]=Schema_func.map(_.name)
for(i <-o to column_seq.length-1){println(i+" " + column_seq(i))}
返回如
0 col1 1 col2 2 col3 3 col4
现在我需要将所有这些索引和列名称传递给DataFrame的下面函数
df.withColumn("_tmp", split($"columnToSplit", "\\.")).select($"_tmp".getItem(0).as("col1"),$"_tmp".getItem(1).as("col2"),$"_tmp".getItem(2).as("col3")).drop("_tmp")
in
$"_tmp".getItem(0).as("col1"),$"_tmp".getItem(1).as("col2"),
因为我不能用所有1000列创建long语句,是否有任何有效的方法将所有这些参数从上面提到的json模式传递给select函数,这样我就可以拆分列,添加标题然后转换DF到实木复合地板。
答案 0 :(得分:0)
您可以构建一系列select
,其中每一个都是选择正确的项目并具有正确名称的结果,然后是val columns: Seq[Column] = Schema_func.map(_.name)
.zipWithIndex // attach index to names
.map { case (name, index) => $"_tmp".getItem(index) as name }
val result = df
.withColumn("_tmp", split($"columnToSplit", "\\."))
.select(columns: _*)
这些列:
case class A(name: String)
val Schema_func = Seq(A("c1"), A("c2"), A("c3"), A("c4"), A("c5"))
val df = Seq("a.b.c.d.e").toDF("columnToSplit")
例如,对于此输入:
result
// +---+---+---+---+---+
// | c1| c2| c3| c4| c5|
// +---+---+---+---+---+
// | a| b| c| d| e|
// +---+---+---+---+---+
将是:
logontoparticle