验证Spark中可变数量的列

时间:2016-07-28 15:42:21

标签: validation apache-spark apache-spark-sql

我有一堆代码,表明一个人在水平显示的数据中的阶段,如下所示。

Name code1 code2 code3 code4
A 2 3. 4 Null
B 2 5 4 7
C 1 3 4 5
D 0 9 Null Null

我有另一个包含所有有效代码的文件。

ID Value
1  3
2  4
3  5
4  6
5  7

我想做的是针对此查找逐个单元格验证所有列,并指出0是否有效,如果它们无效则指出null

我正在使用Apache Spark 1.5.2,我想以有效的方式做到这一点。我已经尝试了很多组合,只有接近我想要的东西我才会在单元格上使用concat,然后将其作为规范化表格进行爆炸,然后执行查找。

1 个答案:

答案 0 :(得分:0)

您可以通过单次传递数据来完成此操作,无需任何连接或explode代码生成验证表达式:

// Simulate the data
case class Record(Name: String, code1: Option[Int], code2: Option[Int])
val dfData = sc.parallelize(Seq(
  Record("A", Some(3), Some(4)), 
  Record("B", Some(3), None)
)).toDF.registerTempTable("my_data")

// Simulate the lookup table
val dfLookup = sc.parallelize(Seq((1,3), (2,4))).toDF("ID", "Value")

// Build a validation expression
val validationExpression = dfLookup.collect.map{ row => 
  s"code${row.getInt(0)} = ${row.getInt(1)}"
}.mkString(" and ")

// Add an is_valid column to the data
sql(s"select *, nvl($validationExpression, false) as is_valid from my_data").show

这会产生:

defined class Record
dfData: Unit = ()
dfLookup: org.apache.spark.sql.DataFrame = [ID: int, Value: int]
validationExpression: String = code1 = 3 and code2 = 4

+----+-----+-----+--------+
|Name|code1|code2|is_valid|
+----+-----+-----+--------+
|   A|    3|    4|    true|
|   B|    3| null|   false|
+----+-----+-----+--------+