2016-07-28 17 views
1

我有一堆代碼,指示一個人在我的數據中水平顯示的階段,如下所示。針對Spark中可變數量的列進行驗證

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

可以做到這一點很簡單地用單次通過的數據,而沒有任何由聯接或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| 
+----+-----+-----+--------+