2016-10-27 5 views
0

동일한 ID를 가진 행을 포함하는 데이터 프레임이 있습니다.spark - union 데이터 프레임 행을 한 행으로

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

수 나는 하나의 행 (한 JSON) 다음

데이터의 예입니다으로 노동 조합에 동일한 ID를 가진 모든 행이 필요 끝났어? 당신이 관련 컬럼을 "병합"후

안부, 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 : undefined function collect_list' –

+0

아, 제 생각에는 org.apache.spark "%%" spark-hive "(org.apache.spark"%% "spark-sql"'외에도)이 함수의 구현은 Spark의 하이브 지원에 있기 때문에 ... –

관련 문제