2017-01-19 3 views
3

반복하되 데이터 프레임이 있습니다 :업데이트 열 DataFrame

import sqlContext.implicits._ 

case class TestData(banana: String, orange: String, apple : String, feijoa: String) 

var data = sc.parallelize((1 to 5).map(i => TestData("banana="+i.toString, 
        "orange="+i.toString,"apple="+i.toString,"feijoa="+i.toString))).toDF 

data.registerTempTable("data") 
data.show 

다음과 같습니다

case class result(fruits: Set[String], weight: Double) 

val results = List(
     result(Set("banana=1"), 200), 
     result(Set("banana=3", "orange=3"), 180), 
     result(Set("banana=2", "orange=2", "apple=3"), 170) 
) 
: 또한

+--------+--------+-------+--------+ 
| banana| orange| apple| feijoa| 
+--------+--------+-------+--------+ 
|banana=1|orange=1|apple=1|feijoa=1| 
|banana=2|orange=2|apple=2|feijoa=2| 
|banana=3|orange=3|apple=3|feijoa=3| 
|banana=4|orange=4|apple=4|feijoa=4| 
|banana=5|orange=5|apple=5|feijoa=5| 
+--------+--------+-------+--------+ 

resultssorted 목록이

반복하고 싶습니다 results, 단 하나와 비교하십시오예 banana = 1 들어 dataframe의 각 컬럼은 하나 개의 값을 포함 : 데이터 프레임의 행3210 및 행 contains 특정 result

업데이트 경우 해당 열에 1 세트. 이 값들로 만들어진 result.fruits 집합입니다. 나는에 도움이 필요)

(0 to results.size-1) 
    .map(i => results(i).fruits) 

2) 나는 results

data = 
(1 to results.size) 
.par 
.foldLeft(data){ case(data,i) => 
    data.withColumn(i.toString(),lit(0)) 
}  


+--------+--------+-------+--------+-+-+-+ 
| banana| orange| apple| feijoa|1|2|3| 
+--------+--------+-------+--------+-+-+-+ 
|banana=1|orange=1|apple=1|feijoa=1|0|0|0| 
|banana=2|orange=2|apple=2|feijoa=2|0|0|0| 
|banana=3|orange=3|apple=3|feijoa=3|0|0|0| 
|banana=4|orange=4|apple=4|feijoa=4|0|0|0| 
|banana=5|orange=5|apple=5|feijoa=5|0|0|0| 
+--------+--------+-------+--------+-+-+-+ 

3의 크기에 따라 데이터 프레임에 열을 추가하는 방법을 알고 : 나는 결과를 반복하는 방법을 알고

1) 특정 rowresult.fruits이 포함되어 있는지 확인하는 select 기능을 결합하는 방법을 이해하고 적절한 열에 1 값을 설정하십시오. 먼저 results 열에서 값을 설정하십시오.는 두 번째 results 목록에서 열 #2 등의

답변

1

이 같은 시도 (간단한 솔루션을 제공을하지만 당신은 그것을 일반화 수) :

data = data.withColumn("combined", array($"banana",$"orange", $"apple",$"feijoa")) 
def getFunc(resultSet: Set[String]) = { 
    def f(x: Seq[String]): Int = { 
     if(resultSet.forall(y=>x.contains(y))) 1 else 0 
    } 
    udf(f _) 
} 

data =(1 to results.size).foldLeft(data){ 
    (x,i) => x.withColumn(i.toString, getFunc(results(i-1).fruits)($"combined")) 
}