运行多个sql查询并测试通过或失败Spark Scala

运行多个sql查询并测试通过或失败Spark Scala,sql,apache-spark,hadoop,hiveql,cloudera,Sql,Apache Spark,Hadoop,Hiveql,Cloudera,我正在运行100个查询测试用例来检查Spark Scala中的数据质量。我正在从配置单元表查询数据 以下示例查询的预期结果为空数据框: SELECT car_type FROM car_data WHERE car_version is null SELECT car_color FROM car_data WHERE car_date is null SELECT car_sale FROM car_data WHERE car_timestamp is null 我想根据预期结果将测试用例

我正在运行100个查询测试用例来检查Spark Scala中的数据质量。我正在从配置单元表查询数据

以下示例查询的预期结果为空数据框:

SELECT car_type FROM car_data WHERE car_version is null
SELECT car_color FROM car_data WHERE car_date is null
SELECT car_sale FROM car_data WHERE car_timestamp is null
我想根据预期结果将测试用例是否通过或失败写入文本文件。我想知道实现这一目标的最佳方法

到目前为止,我所拥有的:

val test_1 = context.sql("SELECT car_type FROM car_data WHERE car_version is null")
val test_2 = context.sql("SELECT car_color FROM car_data WHERE car_date is null")
val test_3 = context.sql("SELECT car_sale FROM car_data WHERE car_timestamp is null")
test_1.head(1).isEmpty 

如果您想知道是否有任何值为NULL,可以使用条件聚合。我倾向于使用一个查询运行所有测试:

SELECT (CASE WHEN COUNT(*) = COUNT(car_type) THEN 'PASS' ELSE 'FAIL' END) as car_type_test,
       (CASE WHEN COUNT(*) = COUNT(car_color) THEN 'PASS' ELSE 'FAIL' END) as car_color_test,
       (CASE WHEN COUNT(*) = COUNT(car_sale) THEN 'PASS' ELSE 'FAIL' END) as car_sale_test       
FROM car_data;

注意:这将考虑一个空表来通过测试,而您的代码不会。这些可以很容易地修改以处理这种情况,但这种行为对我来说是有意义的。

如果我有一个更复杂的查询来检查是否为空,该怎么办?示例:从车号数据中选择计数*、车号作业,其中车号作业不在车号类型、车号许可证、车号取消、车号颜色、车号合同、车号金属、车号和车号作业组中_job@Defcon . . . 可以使用条件聚合将它们合并到这样一个查询中,条件聚合是sumcase,然后是1,否则是0 end。您是否有一个例子来说明在这种情况下会是什么样子?不确定语法。@Defcon。新问题应作为问题而不是评论提出。