在spark文档中,很清楚如何从RDD您自己的案例类创建镶木地板文件; (来自文档)
val people: RDD[Person] = ??? // An RDD of case class objects, from the previous example.
// The RDD is implicitly converted to a SchemaRDD by createSchemaRDD, allowing it to be stored using Parquet.
people.saveAsParquetFile("people.parquet")
Run Code Online (Sandbox Code Playgroud)
但不清楚如何转换回来,我们真的想要一个readParquetFile我们可以做的方法:
val people: RDD[Person] = sc.readParquestFile[Person](path)
Run Code Online (Sandbox Code Playgroud)
其中定义了case类的那些值是由方法读取的那些值.
我有一组嵌套的case类.我有一个使用这些案例类生成数据集的作业,并将输出写入镶木地板.
我非常恼火地发现我必须手动加载并加载这些数据并将其转换回案例类以便在后续作业中使用它.无论如何,这就是我现在要做的事情.
我的案例类如下:
case class Person(userId: String, tech: Option[Tech])
case class Tech(browsers: Seq[Browser], platforms: Seq[Platform])
case class Browser(family: String, version: Int)
Run Code Online (Sandbox Code Playgroud)
所以我正在加载我的镶木地板数据.我可以将tech数据作为Row:
val df = sqlContext.load("part-r-00716.gz.parquet")
val x = df.head
val tech = x.getStruct(x.fieldIndex("tech"))
Run Code Online (Sandbox Code Playgroud)
但现在我找不到如何实际迭代浏览器.如果我尝试val browsers = tech.getStruct(tech.fieldIndex("browsers"))我得到一个例外:
java.lang.ClassCastException: scala.collection.mutable.WrappedArray$ofRef cannot be cast to org.apache.spark.sql.Row
Run Code Online (Sandbox Code Playgroud)
如何使用spark 1.5.2迭代我的嵌套浏览器数据?
更新
实际上,我的case类包含可选值,所以Browser实际上是:
case class Browser(family: String,
major: Option[String] = None,
minor: Option[String] = None,
patch: Option[String] = None,
language: String,
timesSeen: Long = 1,
firstSeenAt: …Run Code Online (Sandbox Code Playgroud)