动态地将参数传递给scala中的函数

时间:2018-06-01 21:07:55

标签: scala apache-spark apache-spark-sql bigdata

我有记录为字符串,其中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到实木复合地板。

1 个答案:

答案 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