【问题标题】:dynamically pass arguments to function in scala动态地将参数传递给scala中的函数
【发布时间】:2018-11-12 01:02:59
【问题描述】:

我在数据框中记录为字符串,其中包含 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 列1 1 列 2 2 列 3 3 列4

现在我需要将所有这些索引和列名传递给 DataFrame 的下面函数

df.withColumn("_tmp", split($"columnToSplit", "\\.")).select($"_tmp".getItem(0).as("col1"),$"_tmp".getItem(1).as("col2"),$"_tmp".getItem(2).as("col3")).drop("_tmp")

$"_tmp".getItem(0).as("col1"),$"_tmp".getItem(1).as("col2"),

由于我无法创建包含所有 1000 列的长语句,是否有任何有效的方法可以将上述 json 模式中的所有这些参数传递给选择函数,以便我可以拆分列、添加标题然后隐藏 DF拼花。

【问题讨论】:

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


    【解决方案1】:

    您可以构建一系列org.apache.spark.sql.Column,其中每一个都是选择正确的项目并具有正确名称的结果,然后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|
    // +---+---+---+---+---+
    

    【讨论】:

      猜你喜欢
      • 2012-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多