首页 > 解决方案 > Spark / Scala中具有多个元素的嵌套模式

问题描述

我想在 spark/scala 中创建一个预定义的模式,以便我可以相应地读取 json 文件。Schema的结构如下:

root
 |-- arrayCol: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- email: array (nullable = true)
 |    |    |    |-- element: string (containsNull = true)
 |    |    |-- id: string (nullable = true)
 |    |    |-- name: string (nullable = true)
 |    |    |-- id2: string (nullable = true)
 |    |    |-- price: string (nullable = true)
 |    |    |-- qty: long (nullable = true)
 |    |    |-- window: struct (nullable = true)
 |    |    |    |-- end: string (nullable = true)
 |    |    |    |-- start: string (nullable = true)
 |-- primaryKeys: string (nullable = true)
 |-- state: string (nullable = true)

我能够创建架构,但我被困在一个元素有两个子元素的地方。这是我尝试过的

import org.apache.spark.sql.types._
val testSchema = StructType(
List(
    StructField("primaryKeys", StringType, true),
    StructField("state", IntegerType, true),
    StructField("email",ArrayType(StringType,true),true),
    StructField("id",StringType,true),
    StructField("name",StringType,true),
    StructField("id2",StringType,true),
    StructField("price",StringType,true),
    StructField("qty",StringType,true),
    StructField("window",ArrayType(StringType,true),true)
))

我无法弄清楚如何将 start 和 end 包含在该窗口元素中。

标签: scalaapache-sparkapache-spark-sqlschema

解决方案


它是一个嵌套结构,所以它应该是

StructType(StructField("end",StringType,true), StructField("start",StringType,true))

顺便说一句,您可以从案例类中获取架构,如下所示:

import org.apache.spark.sql.catalyst.ScalaReflection

case class ArrayColWindow(end:String,start:String)
case class ArrayCol(id:String,email:Seq[String], qty:Long,rqty:Long,pids:Seq[String],
                        sqty:Long,id1:String,id2:String,window:ArrayColWindow, otherId:String)
    
    
case class FullArrayCols(arrayCol:Seq[ArrayCol],primarykey:String,runtime:String)
val schema =ScalaReflection.schemaFor[FullArrayCols].dataType.asInstanceOf[StructType]

推荐阅读