gpt4 book ai didi

scala - 使用键作为新列 reshape 键值对的 Spark 数据框

转载 作者:行者123 更新时间:2023-12-01 08:59:33 25 4
gpt4 key购买 nike

我是 spark 和 scala 的新手。可以说我有一个列表数据框,它们是键值对。有没有办法将列 ID 的 ID 变量映射为新列?

df.show()
+--------------------+-------------------- +
| ids | vals |
+--------------------+-------------------- +
|[id1,id2,id3] | null |
|[id2,id5,id6] |[WrappedArray(0,2,4)] |
|[id2,id4,id7] |[WrappedArray(6,8,10)]|

预期输出:

+----+----+
|id1 | id2| ...
+----+----+
|null| 0 | ...
|null| 6 | ...

最佳答案

一种可能的方法是计算新 DataFrame 的列并使用这些列来构造行。

import org.apache.spark.sql.functions._

val data = List((Seq("id1","id2","id3"),None),(Seq("id2","id4","id5"),Some(Seq(2,4,5))),(Seq("id3","id5","id6"),Some(Seq(3,5,6))))

val df = sparkContext.parallelize(data).toDF("ids","values")

val values = df.flatMap{
case Row(t1:Seq[String], t2:Seq[Int]) => Some((t1 zip t2).toMap)
case Row(_, null) => None
}

// get the unique names of the columns across the original data
val ids = df.select(explode($"ids")).distinct.collect.map(_.getString(0))

// map the values to the new columns (to Some value or None)
val transposed = values.map(entry => Row.fromSeq(ids.map(id => entry.get(id))))

// programmatically recreate the target schema with the columns we found in the data
import org.apache.spark.sql.types._
val schema = StructType(ids.map(id => StructField(id, IntegerType, nullable=true)))

// Create the new DataFrame
val transposedDf = sqlContext.createDataFrame(transposed, schema)

此过程将遍历数据 2 次,尽管根据支持数据源,计算列名可能相当便宜。

此外,这在 DataFramesRDD 之间来回。我有兴趣看到一个“纯”DataFrame 过程。

关于scala - 使用键作为新列 reshape 键值对的 Spark 数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39266857/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com