2016-10-27 1 views
0

同じIDの行を含むデータフレームがあります。私はここに1つの行(1つのJSON)spark - unionデータフレームの行を1行にする

に同一のIDを持つ全ての行組合に必要 はデータの例である:

id first_name last_name 
1 JAMES   SMITH 
2 MARY   BROWN 
2 DAVID   WILLIAMS 
1 ROBERT  DAVIS 

要求された結果である:

{ 
    id:1, 
    entities: [{ 
    first_name:JAMES, 
    last_name:SMITH 
    }, { 
    first_name:ROBERT, 
    last_name:DAVIS 
    }] 
} 
{ 
    id:2, 
    entities: [{ 
    first_name:MARY, 
    last_name:BROWN 
    }, { 
    first_name:DAVID, 
    last_name:WILLIAMS 
    }] 
} 

缶それは行われる?

よろしく、Yaniv

答えて

1

あなたは、単一の、ネストされた構造に関連する列を「マージ」の後にあなたがgroupBycollect_listを使用することができます。

val input: DataFrame = Seq(
    (1, "JAMES", "SMITH"), 
    (2, "MARY", "BROWN"), 
    (2, "DAVID", "WILLIAMS"), 
    (1, "ROBERT", "DAVIS") 
).toDF("id", "first_name", "last_name") 

import org.apache.spark.sql.functions._ 
val result = input 
    .withColumn("entity", struct($"first_name", $"last_name")) 
    .groupBy("id").agg(collect_list($"entity")) 

result.show(false) 
// +---+--------------------------------+ 
// |id |entities      | 
// +---+--------------------------------+ 
// |1 |[[JAMES,SMITH], [ROBERT,DAVIS]] | 
// |2 |[[MARY,BROWN], [DAVID,WILLIAMS]]| 
// +---+--------------------------------+ 

result.printSchema() 
// root 
// |-- id: integer (nullable = false) 
// |-- entities: array (nullable = true) 
// | |-- element: struct (containsNull = true) 
// | | |-- first_name: string (nullable = true) 
// | | |-- last_name: string (nullable = true) 
+0

は 'その使用をcollect_list'andを認識していません、ありがとう。 – Shankar

+0

あなたの答えは、 ありがとうTzachありがとう、コードを実行しようとすると例外が発生します: 'AnalysisException:未定義関数collect_list' –

+0

ああ、私はあなたが' 'org.apache.spark" %% " (org.apache.spark "%%" spark-sql "'に加えて)依存関係の中で、この関数の実装がSparkのHiveサポートにあるため、「spark-hive」を使用しています... –

関連する問題