我们有一个JSON文件作为spark程序的输入(它描述了模式定义,我们希望通过spark在每列上检查的约束),并且我们想要执行一些数据质量检查(Not NULL,UNIQUE)和模式验证
JSON File:
{
"id":"1",
"name":"employee",
"source":"local",
"file_type":"text",
"sub_file_type":"csv",
"delimeter":",",
"path":"/user/all/dqdata/data/emp.txt",
"columns":[
{"column_name":"empid","datatype":"integer","constraints":["not null","unique"],"values_permitted":["1","2"]},
{"column_name":"empname","datatype":"string","constraints":["not null","unique"],"values_permitted":["1","2"]},
{"column_name":"salary","datatype":"double","constraints":["not null","unique"],"values_permitted":["1","2"]},
{"column_name":"doj","datatype":"date","constraints":["not null","unique"],"values_permitted":["1","2"]},
{"column_name":"location","string":"number","constraints":["not null","unique"],"values_permitted":["1","2"]}
]
}
示例CSV输入:
empId,empname,salar,dob,位置
1,a,10000,11-03-2019,浦那
2,b,10020,14-03-2019,浦那
3,a,10010,15-03-2019,浦那
a,1,10010,15-03-2019,浦那
请记住,
1)我故意将empId和name字段的无效数据放入(检查最后一条记录)。 2)json文件中的列数不固定吗?
问题:
如何验证记录是否符合给定的数据类型/模式(在JSON中)?
我们尝试了以下方法:
1)如果我们尝试通过应用外部模式使用数据帧从CSV文件中加载数据,则spark程序会立即引发一些强制转换异常(NumberFormatException等),并异常终止该程序。但是我想继续执行流程,并将特定错误记录为“列empID的数据类型不匹配错误”。 仅当我们在数据帧上调用一些RDD操作时,上述情况才有效,我觉得这是一种验证模式的烦人方法
2)尝试了以下选项,它也对我有用,但是出现了一些新问题。
Rdd1 = sc.textfile()
Rdd1.foreach(
Try{
Logic to validate the schema
}catch(){
Sop(datatype nismatch due to column name)
}
问题是哪一列的数据类型不匹配 这些将引发异常,并且在异常范围内,我想更新我的自定义ReportOutput对象(我不知道如何在foreach函数中更新该对象)
请指导我,我们如何在火花中实现它?
谢谢。