我有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 |
答案 0 :(得分:0)
您可以从headers
数据帧创建列名列表,并使用select
将data
数组元素映射到相应的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函数重命名列。