2016-07-28 2 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 

は、彼らが有効でない場合は、この検索に対する細胞によってすべての列のセルを検証し、それらが有効であれば0nullを示しています。

私は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| 
+----+-----+-----+--------+ 
関連する問題