繁体   English   中英

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

[英]What is the proper way to validate datatype of csv data in spark?

我们有一个JSON文件作为spark程序的输入(描述了我们要在每列上检查的架构定义和约束),我想执行一些数据质量检查,例如(Not NULL,UNIQUE)和数据类型验证(想检查csv文件是否包含根据json模式的数据?)。

JSON档案:

{

“ id”:“ 1”,

“名称”:“雇员”,

“源”:“本地”,

“ file_type”:“文本”,

“ sub_file_type”:“ csv”,

“ delimeter”:“,”,

“ path”:“ /用户/全部/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”:“薪水”,“数据类型”:“双精度”,“约束”:[“非空”,“唯一”],“ 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动作时,上述情况才起作用,我觉得这是一种验证模式的怪异方法。

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

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

  1. 读取csv文件作为Strings Dataset ,以便每一行都行
  2. 使用map函数解析数据集,以检查每列是否存在Null或数据类型问题
  3. 添加额外的两列,一个名为validRowboolean和一个称为messagedescriptionString
  4. 使用“ 2.”中提到的解析器,对每列中的每个值进行某种try/catchTry/Success/Failure并捕获异常,并相应地设置validRowdescription
  5. 进行过滤,然后将一个成功的DataFrame/DataSetvalidRow标志设置为True )写入成功的位置,然后将错误的DataFrame/DataSet写入错误的位置

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM