Reshaping Data with Pivot in Sparkは、pivot
で再形成をサポートします。私はmelt
がほぼと呼ばれるピボットの逆であると理解しました。私は比較的新しいSpark
です。私の知る限り、私は溶融操作を実装しようとしました。
def melt(df: DataFrame, columns: List[String]): DataFrame ={
val restOfTheColumns = df.columns.filterNot(columns.contains(_))
val baseDF = df.select(columns.head, columns.tail: _*)
val newStructure =StructType(baseDF.schema.fields ++ List(StructField("variable", StringType, true), StructField("value", StringType, true)))
var newdf = sqlContext.createDataFrame(sqlContext.sparkContext.emptyRDD[Row], newStructure)
for(variableCol <- restOfTheColumns){
val colValues = df.select(variableCol).map(r=> r(0).toString)
val colRdd=baseDF.rdd.zip(colValues).map(tuple => Row.fromSeq(tuple._1.toSeq.:+(variableCol).:+(tuple._2.toString)))
var colDF =sqlContext.createDataFrame(colRdd, newStructure)
newdf =newdf.unionAll(colDF)
}
newdf
}
これは作業です。しかし、私は効率についてはあまりよく分かりません。
+-----+---+---+----------+------+
| name|sex|age| street|weight|
+-----+---+---+----------+------+
|Alice| f| 34| somewhere| 70|
| Bob| m| 63| nowhere| -70|
|Alice| f|612|nextstreet| 23|
| Bob| m|612| moon| 8|
+-----+---+---+----------+------+
が
melt(df, List("name", "sex"))
として使用することができ、結果は以下の通りです:
+-----+---+--------+----------+
| name|sex|variable| value|
+-----+---+--------+----------+
|Alice| f| age| 34|
| Bob| m| age| 63|
|Alice| f| age| 612|
| Bob| m| age| 612|
|Alice| f| street| somewhere|
| Bob| m| street| nowhere|
|Alice| f| street|nextstreet|
| Bob| m| street| moon|
|Alice| f| weight| 70|
| Bob| m| weight| -70|
|Alice| f| weight| 23|
| Bob| m| weight| 8|
+-----+---+--------+----------+
改善の余地がある場合、私はそれが有用であると思いますし、あなたのコメントに感謝します。
そうではありません。あなたのデータをメモリに収めるには、 'as.data.frame()'を使ってSpark DataFrameをネイティブのdata.frameに変換し、再構成してSparkに書き戻します。 – Thomas
何もありませんので。あなた自身で書く必要があります。 – eliasah