LogisticRegression으로 모델 학습한 결과 테이블 중에서 rawprediction, probability 값이 vector 형태로 나오는데 spark sql에서 인덱스 1 값을 가지고 오고 싶어서 방법 찾던 중 해결한 방법. 추후에 spark를 더 공부한 후 다른 방법을 찾으면 글 업데이트할 예정.
현재 사용하고 있는 Spark 버전은 Spark 2.3.1
spark 3.0.0 버전 부터는 vector_to_array 함수 제공
Spark DataFrame 스키마에 column dataType이 vector인 경우가 있을 때 Spark Sql에서 데이터를 꺼내오기 위해 아래와 같이 처리함.
- vector 가 포함되어 있는 데이터 프레임 스키마
- withColumn : 데이터 프레임에 새로운 컬럼 추가하는 transformation function을 사용하여 vector 컬럼을 array 형태로 컬럼 추가 후 데이터 select
import org.apache.spark.ml.linalg.DenseVector
val toArr: Any => Array[Double] = _.asInstanceOf[DenseVector].toArray
val toArrUdf = udf(toArr)
val resultDf = vPredictsDf.withColumn("rawPrediction_arr",toArrUdf($"rawPrediction")).withColumn("probability_arr",toArrUdf($"probability"))
resultDf.printSchema
spark.sql(s""" SELECT rawPrediction_arr[1] FROM resultTb """).show(5)
- resultDf.printSchema 결과
- Spark.sql 결과
- to_array 사용했을 경우 에러
Undefined function: 'to_array'. This function is neither a registered temporary function nor a permanent function registered in the database 'default'.;
df.select(ith("features", lit(1))).show()
to_array(features)[1]
- vector_to_array 사용했을 경우 에러
Undefined function: 'vector_to_array'. This function is neither a registered temporary function nor a permanent function registered in the database 'default'.;
- 스키마 조회
데이타프레임.printSchema
- 참고
'BigData > Spark' 카테고리의 다른 글
[Spark] RDD(Resilient Distributed Dataset) 개념과 연산 예제 (0) | 2021.11.06 |
---|---|
[Spark] 스파크 개념 (0) | 2021.10.20 |
댓글