Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/204.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何使用functions.explode展平数据帧中的元素_Scala_Apache Spark - Fatal编程技术网

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使用反射找出适合表示给定类的数据帧模式的方法。还有其他从类推断模式的方法,有关更多选项,请参阅。