2016-11-03 10 views

답변

0

감사합니다. @ user6910411 감사합니다. 데이터에 따라 밀도가 높은 벡터 또는 희소 한 벡터를 사용하고 MaxAbsScaler으로 대체하고 linalg.Vectors 또는 DenseVector 의 값을 추출 할 수 있습니다. 필요한 중간 및 역 배율 지점에서 데이터를 반으로 나누고 DF를 모두 병합하고 병합하는 것이 좋습니다.

import org.apache.spark.mllib.linalg.Vectors 
import org.apache.spark.ml.feature.Normalizer 
import org.apache.spark.ml.feature.MaxAbsScaler 
import org.apache.spark.ml.feature.MinMaxScaler 
import org.apache.spark.ml.feature.VectorAssembler 
import org.apache.spark.ml.linalg.DenseVector 
import org.apache.spark.sql.functions.udf 

val vectorToColumn = udf{ (x: DenseVector, index: Int) => x(index) } 

val gt50 = df.filter("score >= 55").select('id,('score * -1).as("score")) 
val lt50 = df.filter("score < 55") 

val assembler = new VectorAssembler() 
.setInputCols(Array("score")) 
.setOutputCol("features") 

val ass_lt50 = assembler.transform(lt50) 
val ass_gt50 = assembler.transform(gt50) 

val scaler = new MinMaxScaler() 
.setInputCol("features") 
.setOutputCol("featuresScaled") 
.setMax(100) 
.setMin(0) 

val feat_lt50 = scaler.fit(ass_lt50).transform(ass_lt50).drop('score) 
val feat_gt50 = scaler.fit(ass_gt50).transform(ass_gt50).drop('score) 

val scaled_lt50 = feat_lt50.select('id,round(
vectorToColumn(col("featuresScaled"),lit(0))).as("scaled_score")) 

val scaled_gt50 = feat_gt50.select('id,round(
vectorToColumn(col("featuresScaled"),lit(0))).as("scaled_score")) 

val scaled = scaled_lt50.unionAll(scaled_gt50)