代码之家  ›  专栏  ›  技术社区  ›  Ged

所有数据帧列的concat使用fold,用spark/scala减少

  •  0
  • Ged  · 技术社区  · 5 年前

    动态列生成可以很好地执行以下操作:

    import org.apache.spark.sql.functions._
    import sqlContext.implicits._
    import org.apache.spark.sql.DataFrame
    
    val input = sc.parallelize(Seq(
       ("a", "5a", "7w", "9", "a12", "a13") 
       )).toDF("ID", "var1", "var2", "var3", "var4", "var5")
    
    val columns_to_concat = input.columns
    input.select(concat(columns_to_concat.map(c => col(c)): _*).as("concat_column")).show(false)
    

    返回:

    +-------------+
    |concat_column|
    +-------------+
    |a5a7w9a12a13 |
    +-------------+
    

    我该怎么做呢 向左折叠,缩小 -同时保留动态柱生成?

    我总是得到一个错误,或者返回一个空值。虽然海螺已经足够了,但我对折叠等如何工作感到好奇。

    1 回复  |  直到 5 年前
        1
  •  2
  •   community wiki 2 revs user11014805    5 年前

    这绝对不是该走的路 *,但如果将其视为编程练习:

    import org.apache.spark.sql.functions.{col, concat, lit}
    
    columns_to_concat.map(col(_)).reduce(concat(_, _))
    

    columns_to_concat.map(col(_)).foldLeft(lit(""))(concat(_, _))
    

    *因为

    • 对于已经由高级API提供的内容,这是一个复杂的解决方案。
    • 因为它需要规划者/优化器的额外工作来扁平递归表达式,更不用说表达式不使用尾调用递归,只会溢出。