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을 사용하고 나서 정상화 테이블로 폭발 후 조회를 수행합니다.

어떤에 의해 조인 또는 explode없이 당신은 아주 간단하게 데이터를 통해 하나의 패스로이 작업을 수행 할 수 있습니다

답변

0

코드 생성, 검증 표현 :

// 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| 
+----+-----+-----+--------+ 
관련 문제