Spark/Scala—验证流数据帧中一行的JSON文档
我有一个流应用程序,它正在处理一个包含JSON字符串的“body”列的流数据帧 因此,在主体中类似于(这是四个输入行): 我想检查每一行是否有正确的模式(数据类型和包含所有属性)。我想过滤掉一些无效的记录并记录在某个地方(比如拼花文件)。我对“details”数组特别感兴趣——每个嵌套文档都必须具有指定的字段和正确的数据类型 因此,在上面的示例中,只有行id=1是有效的 我在考虑一个案例类,例如:Spark/Scala—验证流数据帧中一行的JSON文档,scala,apache-spark,Scala,Apache Spark,我有一个流应用程序,它正在处理一个包含JSON字符串的“body”列的流数据帧 因此,在主体中类似于(这是四个输入行): 我想检查每一行是否有正确的模式(数据类型和包含所有属性)。我想过滤掉一些无效的记录并记录在某个地方(比如拼花文件)。我对“details”数组特别感兴趣——每个嵌套文档都必须具有指定的字段和正确的数据类型 因此,在上面的示例中,只有行id=1是有效的 我在考虑一个案例类,例如: case class Detail( id: Int, attr2: Int, att
case class Detail(
id: Int,
attr2: Int,
attr3: String
)
case class Input(
id: Int,
ts: Long,
details: Seq[Detail]
)
试着但不确定该怎么做
有人能帮忙吗
谢谢有一种方法可以帮助您对数据进行模式验证。如果你是新手,这个页面是一个很好的开始
另一种方法大致工作如下
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)