【问题标题】:Create a dataframe by combining header and data dataframes通过组合标头和数据数据帧来创建数据帧
【发布时间】:2019-02-27 12:48:25
【问题描述】:

我有 2 个数据框:

|data          |
|--------------|
|[1,Rob,12]    |
|[2,Jeremy,11] |
|[3,Bart,14]   |


scala> data.printSchema()

root
 |-- data: array (nullable = true)
 |    |-- element: string (containsNull = true)

|headers         |
|----------------|
|[id,name,deptid]|


scala> headers.printSchema()

root
|-- headers: array (nullable = true)
|    |-- element: string (containsNull = true)

问题:如何使用标头 DF 和数据 DF 创建具有以下格式的输出数据帧?

| id | name  | deptid|
|----| ------|-------|
| 1  | Rob   | 12    |
| 2  | Jeremy| 11    |
| 3  | Bart  | 14    |

【问题讨论】:

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


    【解决方案1】:

    您可以检查以下线程以从数组中获取列:

    How to explode an array into multiple columns in Spark

    您可以使用 withColumnRenamed 函数重命名列。

    【讨论】:

      【解决方案2】:

      您可以从headers DataFrame 创建列名列表,并使用selectdata 数组元素映射到相应的headers 数组元素:

      import org.apache.spark.sql.functions._
      
      val dataDF = Seq(
        Seq("1", "Rob", "12"),
        Seq("2", "Jeremy", "11"),
        Seq("3", "Bart", "14")
      ).toDF("data")
      
      val headersDF = Seq(
        Seq("id", "name", "deptid")
      ).toDF("headers")
      
      val cols = headersDF.first.getSeq[String](0)
      // cols: Seq[String] = WrappedArray(id, name, deptid)
      
      val resultDF = dataDF.
        select( (0 until cols.size).map( i => $"data"(i).as(cols(i)) ): _* )
      
      resultDF.show
      // +---+------+------+
      // | id|  name|deptid|
      // +---+------+------+
      // |  1|   Rob|    12|
      // |  2|Jeremy|    11|
      // |  3|  Bart|    14|
      // +---+------+------+
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-03
        相关资源
        最近更新 更多