2017-11-14 18 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") 

が本当のデータフレームは、列の数百程度含まれている可能性が考えてみましょう。出力の列の順序を保持する必要はありません。

編集:列内に繰り返し要素がありますが、固有の要素が必要な場合もあります。

私はscala 2.11でSpark 2.0.2を使用しています。

提案がありますか?

ありがとうございます!

+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]| 
+---------+------------+---------+ 
関連する問題