2017-10-15 56 views
0

我有dataframe像下面。在斯卡拉轉置數據幀

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

我需要一個像下面

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

我非常新的斯卡拉輸出..我只是需要一種方法來做到這一點。我已經在互聯網上研究過有關轉置,但無法獲得解決方案。

回答

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]| 
+---+------+----------------+