0

나는 이와 비슷한 수치가있는 dataframe이 : 나는 각각의 연속적인 항목에 대한 확률의 평균을 찾을 필요가스파크에서 연속 항목의 의미 찾는 방법

probability 
0 
0.2 
0.3 
0.4 
0.5 

DF 및 다음

expectedMeanDF

mean 
0 
0.1 
0.25 
0.35 
0.45 
1 

0.1 원하는 I 그래서 0.2과 0.3 0 0.2, 0.25의 평균 ... 나는이 작업을 수행하기 위해 다음과 같은 방법으로 윈도우 기능을 사용하고

는 S :

df.withColumn("partition", dp.col("probability")*0) 

val window = Window.partitionBy("partition") 
val mean = distinctProbability.withColumn("mean", (newdp.col("probability") + lead("probability", 1).over(window))/2).drop("partition").drop("probability") 

그래서이 문제를 가지고 이 방법 : 그것은 dataframe의 처음과 마지막 위치에 0과 1을 추가 할 수 없습니다입니다

  1. 은 각각
  2. 그것은 매우 효율적이 아니다. 내 DF의 행 수가 3 천 개까지 올라갈 수 있으므로 문제가됩니다.

대체 방법은 무엇입니까?

답변

2

30 만 개가 많지 않으므로 로컬 처리 속도가 빠를 수는 있지만 올바르지 않습니다. partitionBy 셔플이 발생하고 orderBy 데이터가 없으면 예상 한 순서와 다른 순서로 넣을 수 있습니다.

내가 아는 유일한 확장 가능한 솔루션은 RDD로 변환하는 것입니다

val df = Seq(0, 0.2, 0.3, 0.4, 0.5).toDF("probability") 
val rdd = df.orderBy($"probability").as[Double].rdd 

수입 RDDFunctions

import org.apache.spark.mllib.rdd.RDDFunctions._ 

사용 슬라이딩 방법 :

val slides = rdd.sliding(2).toDS 

은 평균 찾을 :

val means = slides.map(slide => slide.sum/slide.size) 

다시 변환 DataFrame에 :

+-----+ 
|value| 
+-----+ 
| 0.1| 
| 0.25| 
| 0.35| 
| 0.45| 
+-----+ 

을하지만, 수동 범위의 경계를 추가해야합니다 :

means.toDF 

그것은 모든 연속적인 값을 다룰 것입니다.