scala - 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 包含在该窗口元素中。
解决方案
它是一个嵌套结构,所以它应该是
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]
推荐阅读
- git - 我可以追溯修复应该是“移动和更新”的“删除添加”吗?
- python - Python3 pathlib 添加额外的反斜杠 \\
- java - Android studio的设计视图为空
- python - 从多个来源使用 Web 服务并保存到 Db
- excel - 设置cookie后使用xml http请求抓取网站(Excel vba)
- javascript - 如何将 id 分配给已经附加了 Class 的按钮
- c# - C# UWP 项目中的 Linq 查询代码会根据其部件的顺序运行得更慢还是更快?
- spring - 如果从switchIfEmpty返回服务器响应,则Spring webflux“仅允许一个连接接收订阅者”
- android - 在 SqlLite 数据库数据集更改时动态更新 RecyclerView
- javascript - 有没有办法在 javascript 中遍历 Map 对象时访问索引值?