我们有一个JSON文件作为spark程序的输入(描述了我们要在每列上检查的架构定义和约束),我想执行一些数据质量检查,例如(Not NULL,UNIQUE)和数据类型验证(还要检查csv文件是否根据json模式包含数据?)。
JSON文件:
{
“ id”:“ 1”,
“姓名”:“员工”,
“源”:“本地”,
“ file_type”:“文本”,
“ sub_file_type”:“ csv”,
“公分”:”,”,
“路径”:“ / user / all / dqdata / data / emp.txt”,
“列”:[
{“ 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”]} < / p>
]
}
示例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操作时,上述情况才有效,我认为这是一种验证模式的怪异方法。
请指导我,我们如何在火花中实现它?
答案 0 :(得分:0)
我认为这里没有免费的午餐,您不必自己编写此过程,但是您可以执行的过程是...
Dataset
中的Strings
形式读取csv文件,以便每一行都是正确的map
函数解析数据集以检查每列Null
或数据类型问题boolean
和validRow
或String
来命名的message
description
或try/catch
并捕获异常并设置Try/Success/Failure
和{ {1}}列validRow
(将description
标志设置为DataFrame/DataSet
)写入一个成功的位置,并将错误validRow
写入一个错误地点