验证Spark中的CSV数据的数据类型的正确方法是什么?

时间:2019-06-05 11:28:04

标签: apache-spark

我们有一个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操作时,上述情况才有效,我认为这是一种验证模式的怪异方法。

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

1 个答案:

答案 0 :(得分:0)

我认为这里没有免费的午餐,您不必自己编写此过程,但是您可以执行的过程是...

  1. Dataset中的Strings形式读取csv文件,以便每一行都是正确的
  2. 使用map函数解析数据集以检查每列Null或数据类型问题
  3. 再添加两列,分别是booleanvalidRowString来命名的message
  4. 使用“ 2.”中提到的解析器,对每一列中的每个值执行某种descriptiontry/catch并捕获异常并设置Try/Success/Failure和{ {1}}列
  5. 进行过滤,然后将一个成功的validRow(将description标志设置为DataFrame/DataSet)写入一个成功的位置,并将错误validRow写入一个错误地点