Spark/Scala—验证流数据帧中一行的JSON文档

Spark/Scala—验证流数据帧中一行的JSON文档,scala,apache-spark,Scala,Apache Spark,我有一个流应用程序,它正在处理一个包含JSON字符串的“body”列的流数据帧 因此,在主体中类似于(这是四个输入行): 我想检查每一行是否有正确的模式(数据类型和包含所有属性)。我想过滤掉一些无效的记录并记录在某个地方(比如拼花文件)。我对“details”数组特别感兴趣——每个嵌套文档都必须具有指定的字段和正确的数据类型 因此,在上面的示例中,只有行id=1是有效的 我在考虑一个案例类,例如: case class Detail( id: Int, attr2: Int, att

我有一个流应用程序,它正在处理一个包含JSON字符串的“body”列的流数据帧

因此,在主体中类似于(这是四个输入行):

我想检查每一行是否有正确的模式(数据类型和包含所有属性)。我想过滤掉一些无效的记录并记录在某个地方(比如拼花文件)。我对“details”数组特别感兴趣——每个嵌套文档都必须具有指定的字段和正确的数据类型

因此,在上面的示例中,只有行id=1是有效的

我在考虑一个案例类,例如:

case class Detail(
  id: Int,
  attr2: Int,
  attr3: String
)

case class Input(
  id: Int,
  ts: Long,
  details: Seq[Detail]
)
试着但不确定该怎么做

有人能帮忙吗

谢谢

有一种方法可以帮助您对数据进行模式验证。如果你是新手,这个页面是一个很好的开始

另一种方法大致工作如下

  • 像您在问题中尝试的那样,为每个对象构建模型(案例类)

  • 使用类似/的JSON库解析输入JSON

  • 对于所有无法解析为有效记录的输入,很可能是无效的,您可以将这些输出划分到spark代码中的不同接收器中。如果在对象上有一个
    isValid
    方法,可以验证解析的记录是否正确,那么它也会使这个方法变得健壮


  • 对我来说,最简单的方法是使用模式创建数据帧,然后使用
    id==1
    进行过滤。这不是最有效的方法

    您可以找到一个使用模式创建数据帧的示例:

    编辑 我在scala中找不到加速JSON搜索的预过滤,但您可以使用以下三个选项:

    spark.read.schema(mySchema).format(json).load("myPath").filter($"id" === 1)
    


    谢谢,查看spray json,但不确定如何解析数据帧中的每一行?鉴于输入有一个
    body:String
    ,这是一个json,您可以使用自述()的Usages部分中列出的spray代码来解析json。对不起,我可能缺少明显的内容,但什么是“pid”?是的,如果你能展示最有效的方法,我将不胜感激。谢谢对不起,我的错,它是
    id
    ,不是
    pid
    我添加了一个字符,现在它被编辑了,我将尝试一种更有效的方式再次编辑。@t138我编辑了响应,如果对您的示例不起作用,请告诉我。
    spark.read.schema(mySchema).format(json).load("myPath").filter($"id" === 1)
    
    spark.read.schema(mySchema).json("myPath").filter($"id" === 1)
    
    spark.read.json("myPath").filter($"id" === 1)