2017-11-14 2 views
-1

열 단위로 값을 집계하는 DataFrame을 조 변경하고 싶습니다. 내가 예를 들어 그것을 ilustrate 보자이 DataFrame을 감안할 때Transpose Spark DataFrame 배열로 집계하기

가 :

val df = sc.parallelize(Seq(("A","B","C"), ("D", "E", "F"), ("X", "Y", "Z"), ("A", "N", "Z"))).toDF("col1", "col2", "col3") 
df.show() 
+----+----+----+ 
|col1|col2|col3| 
+----+----+----+ 
| A| B| C| 
| D| E| F| 
| X| Y| Z| 
| A| N| Z| 
+----+----+----+ 

예상 출력 이런 식으로 뭔가해야한다 :

col1: Array("A", "D", "X") 
col2: Array("B", "E", "Y", "N") 
col3: Array("C", "F", "Z") 

실제 DataFrame은 수백 개의 컬럼에 대해 포함 할 수 고려하십시오. 출력의 열 순서를 유지할 필요는 없습니다.

편집 : 열에 반복되는 요소가 있지만 고유 한 요소 만 있으면됩니다.

저는 Spark 2.0.2에 scala 2.11을 사용하고 있습니다.

의견이 있으십니까?

미리 감사드립니다.

+1

이 [SO 링크 (https://stackoverflow.com/questions/40892459/spark-transpose-dataframe-without-aggregating) 당신에게 관심이있을 수 있습니다. –

답변

2

groupBycollect_set을 적용 할 수 있지만 행 수가 상위 인 경우 성능이 의심 스럽습니다.

df.show 
+----+----+----+ 
|col1|col2|col3| 
+----+----+----+ 
| A| B| C| 
| D| E| F| 
| X| Y| Z| 
| A| N| Z| 
+----+----+----+ 

import org.apache.spark.sql.functions._ 
val query = df.columns.map(x => collect_set(col(x)).as(x)) 

df.groupBy(lit(1)) 
    .agg(collect_set($"col1"), query: _*) 
    .select(df.columns.map(col(_)): _*) 
    .show 
+---------+------------+---------+ 
|  col1|  col2|  col3| 
+---------+------------+---------+ 
|[A, D, X]|[B, E, Y, N]|[C, F, Z]| 
+---------+------------+---------+