通过组合标头和数据数据框来创建数据框

时间:2018-09-24 02:30:01

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

我有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    |

2 个答案:

答案 0 :(得分:0)

您可以从headers数据帧创建列名列表,并使用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|
// +---+------+------+

答案 1 :(得分:-1)

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

How to explode an array into multiple columns in Spark

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