Scala 如何使用functions.explode展平数据帧中的元素
我编写了以下代码:Scala 如何使用functions.explode展平数据帧中的元素,scala,apache-spark,Scala,Apache Spark,我编写了以下代码: case class RawPanda(id: Long, zip: String, pt: String, happy: Boolean, attributes: Array[Double]) case class PandaPlace(name: String, pandas: Array[RawPanda]) object TestSparkDataFrame extends App{ System.setProperty("hadoop.home.dir",
case class RawPanda(id: Long, zip: String, pt: String, happy: Boolean, attributes: Array[Double])
case class PandaPlace(name: String, pandas: Array[RawPanda])
object TestSparkDataFrame extends App{
System.setProperty("hadoop.home.dir", "E:\\Programmation\\Libraries\\hadoop")
val conf = new SparkConf().setAppName("TestSparkDataFrame").set("spark.driver.memory","4g").setMaster("local[*]")
val session = SparkSession.builder().config(conf).getOrCreate()
import session.implicits._
def createAndPrintSchemaRawPanda(session:SparkSession):DataFrame = {
val newPanda = RawPanda(1,"M1B 5K7", "giant", true, Array(0.1, 0.1))
val pandaPlace = PandaPlace("torronto", Array(newPanda))
val df =session.createDataFrame(Seq(pandaPlace))
df
}
val df2 = createAndPrintSchemaRawPanda(session)
df2.show
+--------+--------------------+
| name| pandas|
+--------+--------------------+
|torronto|[[1,M1B 5K7,giant...|
+--------+--------------------+
val pandaInfo = df2.explode(df2("pandas")) {
case Row(pandas: Seq[Row]) =>
pandas.map{
case (Row(
id: Long,
zip: String,
pt: String,
happy: Boolean,
attrs: Seq[Double])) => RawPanda(id, zip, pt , happy, attrs.toArray)
}
}
pandaInfo2.show
+--------+--------------------+---+-------+-----+-----+----------+
| name| pandas| id| zip| pt|happy|attributes|
+--------+--------------------+---+-------+-----+-----+----------+
|torronto|[[1,M1B 5K7,giant...| 1|M1B 5K7|giant| true|[0.1, 0.1]|
+--------+--------------------+---+-------+-----+-----+----------+
我使用的explode函数不推荐使用,因此我想重新计算pandaInfo2数据帧,但使用警告中的adviced方法
将flatMap()或select()与函数一起使用。改为explode()
但当我这样做的时候:
val pandaInfo = df2.select(functions.explode(df("pandas"))
我得到了与df2相同的结果。
我不知道如何继续使用flatMap或functions.explode
我如何使用flatMap或functions.explode来获得我想要的结果?(pandaInfo中的那个)
我看到了,但没有一个对我有帮助。使用
explode
函数调用select
,返回一个数据帧,其中数组pandas
被“分解”为单独的记录;然后,如果要“展平”每个记录的结果单个“RawPanda”的结构,可以使用点分隔的“路由”选择各个列:
完全相同的操作的不太详细的版本是:
import org.apache.spark.sql.Encoders // going to use this to "encode" case class into schema
val pandaColumns = Encoders.product[RawPanda].schema.fields.map(_.name)
val pandaInfo3 = df2.select($"name", explode($"pandas") as "pandas")
.select(Seq($"name", $"pandas") ++ pandaColumns.map(f => $"pandas.$f" as f): _*)
使用
explode
函数调用select
,返回一个数据帧,其中数组pandas
被“分解”为单个记录;然后,如果要“展平”每个记录的结果单个“RawPanda”的结构,可以使用点分隔的“路由”选择各个列:
完全相同的操作的不太详细的版本是:
import org.apache.spark.sql.Encoders // going to use this to "encode" case class into schema
val pandaColumns = Encoders.product[RawPanda].schema.fields.map(_.name)
val pandaInfo3 = df2.select($"name", explode($"pandas") as "pandas")
.select(Seq($"name", $"pandas") ++ pandaColumns.map(f => $"pandas.$f" as f): _*)
哇,很好,什么是编码器,你怎么知道你必须使用它?是Spark使用反射找出适合表示给定类的数据帧模式的方法。还有其他方法可以从类中推断模式,有关更多选项,请参阅。哇,很好,什么是编码器?您是如何知道必须使用它的?是Spark使用反射找出适合表示给定类的数据帧模式的方法。还有其他从类推断模式的方法,有关更多选项,请参阅。