如何在Spark中验证模式?

时间:2019-05-31 18:40:51

标签: validation apache-spark

我们有一个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函数中更新该对象)

请指导我,我们如何在火花中实现它?

谢谢。

0 个答案:

没有答案