【问题标题】:How do I move a spark dataframe's columns to a nested column in the same dataframe?如何将 spark 数据框的列移动到同一数据框中的嵌套列?
【发布时间】:2021-05-09 23:15:30
【问题描述】:

我将 spark 数据框的列移动到同一数据框中的嵌套列的方法是这样的:

    .appName("SparkByExamples.com")
    .master("local")
    .getOrCreate()

  import spark.sqlContext.implicits._

  val data = Seq(("Adam", "111", "50000"),
                 ("Abe", "222", "60000"),
                 ("Sam", "333", "40000"))

  var df = data.toDF("Name", "EmpId__c", "Salary__c")
  df.show(false)

  val cstColsSeq = df.columns.filter(c => c.endsWith("__c")).map(f => { col(f) }).toSeq
  var cstMapCol: Column = org.apache.spark.sql.functions.struct(cstColsSeq)
  df = df.withColumn("cstMap", cstMapCol)

问题是我无法为 org.apache.spark.sql.functions.struct(...) 调用提供 Seq[Column]。它只接受一个 Column* 参数。

后续是做这样的事情:

for (i <- cstColsList) {
    cstMapCol = org.apache.spark.sql.functions.struct(i)
    df = df.withColumn("cstMap", cstMapCol)
}

但是,这会覆盖cstMap

有什么想法如何将 cstColsSeq 提供给 struct ?也对其他可能采用不同方法在现有填充数据框中添加嵌套列的解决方案开放。

谢谢!

【问题讨论】:

    标签: scala dataframe apache-spark apache-spark-sql apache-spark-dataset


    【解决方案1】:

    您可以使用: _* 表示法扩展Seq

    var cstMapCol: Column = org.apache.spark.sql.functions.struct(cstColsSeq: _*)
    

    这将给出输出

    df.withColumn("cstMap", cstMapCol).show
    +----+--------+---------+------------+
    |Name|EmpId__c|Salary__c|      cstMap|
    +----+--------+---------+------------+
    |Adam|     111|    50000|[111, 50000]|
    | Abe|     222|    60000|[222, 60000]|
    | Sam|     333|    40000|[333, 40000]|
    +----+--------+---------+------------+
    

    【讨论】:

      猜你喜欢
      • 2020-12-30
      • 2020-03-13
      • 1970-01-01
      • 1970-01-01
      • 2018-09-13
      • 1970-01-01
      • 2022-06-28
      • 1970-01-01
      • 2018-03-06
      相关资源
      最近更新 更多