我有一堆代码,表明一个人在水平显示的数据中的阶段,如下所示。
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
,然后将其作为规范化表格进行爆炸,然后执行查找。
答案 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|
+----+-----+-----+--------+