在Scala中转置Dataframe

时间:2017-10-15 08:20:02

标签: scala spark-dataframe

我有dataframe如下。

+---+------+------+
| ID|Field1|Field2|
+---+------+------+
|  1|     x|     n|
|  2|     a|     b|
+---+------+------+

我需要输出如下

+---+-------------+------+
| ID|       Fields|values|
+---+-------------+------+
|  1|Field1,Field2|   x,n|
|  2|Field1,Field2|   a,b|
+---+-------------+------+

我对scala很新。我只是需要一种方法来做到这一点。我已经在互联网上研究了转置,但无法获得解决方案。

1 个答案:

答案 0 :(得分:1)

由于Fields列在每一行中都是相同的,您可以稍后添加。

在这个示例中,Thing有3个字段:id,Field1,Field2。

val sqlContext = new org.apache.spark.sql.SQLContext( sc )
import sqlContext.implicits._
import org.apache.spark.sql.functions._

val df = 
    sc
    .parallelize( List( Thing( 1, "a", "b" ), Thing( 2, "x", "y" ) ) )
    .toDF( "id", "Field1", "Field2" )

列名以相同的顺序返回,因此我们可以将最后两个用于字段名称

val fieldNames = 
    df
    .columns
    .takeRight( 2 )

org.apache.spark.sql.functions执行组合来自给定列的数据的所有作业。

val res = 
    df
    .select( $"id", array( $"Field1", $"Field2" ) as "values" )
    .withColumn( "Fields", lit( fieldNames ) )

res.show()

结果:

+---+------+----------------+
| id|values|          Fields|
+---+------+----------------+
|  1|[a, b]|[Field1, Field2]|
|  2|[x, y]|[Field1, Field2]|
+---+------+----------------+