2017-12-27 5 views
0

데이터 프레임 행을 열에 조인 할 수있는 방법이 있습니까? I는 입력으로 구조를 다음과 같은 한 : 행을 열로 전치 사용할 수있는 최적화 된 직접 API가있는 경우spark datframe, scala에서 행을 열로 변환하는 방법

val inputDF = Seq(("pid1","enc1", "bat"),("pid1","enc2", ""),("pid1","enc3", ""),("pid3","enc1", "cat"),("pid3","enc2", "")).toDF("MemberID", "EncounterID", "entry") 

inputDF.show: 

+--------+-----------+-----+ 
|MemberID|EncounterID|entry| 
+--------+-----------+-----+ 
| pid1|  enc1| bat| 
| pid1|  enc2|  | 
| pid1|  enc3|  | 
| pid3|  enc1| cat| 
| pid3|  enc2|  | 
+--------+-----------+-----+ 

expected result: 

+--------+----------+----------+----------+-----+ 
|MemberID|Encounter1|Encounter2|Encounter3|entry| 
+--------+----------+----------+----------+-----+ 
| pid1|  enc1|  enc2|  enc3| bat| 
| pid3|  enc1|  enc2|  null| cat| 
+--------+----------+----------+----------+-----+ 

제안하십시오. 내 입력 데이터 크기가 매우 커서, 수집과 같은 작업을 수행하면 드라이버의 모든 데이터를 취할 수 있기 때문에 수행 할 수 없습니다. Spark 2.x를 사용 중입니다.

+0

'entry'가 모두 3 EncounterID'에 대한 값을 갖고 있다면 어떨까요? EncounterID가 3 개 밖에 없습니까? – philantrovert

+0

항목에는 하나의 값만 있습니다. 예 EncounterID는 고정되어 있으며 EncounterID는 3 개입니다. – Kalpesh

+1

이것이 결과라고 확신합니까? 세 Encounter 열은 항상 동일한 값을가집니다 ... – Oli

답변

0

나는 실제로 필요한 것이 무엇인지 확신하지 못합니다. 그러나, 여기 경우는 생각입니다 :

val entries = inputDF.where('entry isNotNull) 
    .where('entry !== "") 
    .select("MemberID", "entry").distinct 

val df = inputDF.groupBy("MemberID") 
    .agg(collect_list("EncounterID") as "encounterList") 
    .join(entries, Seq("MemberID")) 
df.show 
+--------+-------------------------+-----+ 
|MemberID|   encounterList |entry| 
+--------+-------------------------+-----+ 
| pid1|  [enc2, enc1, enc3]| bat| 
| pid3|    [enc2, enc1]| cat| 
+--------+-------------------------+-----+ 

목록의 순서는 결정되지 않습니다하지만 당신은 ... 그것을 분류하고 .withColumn("Encounter1", sort_array($"encounterList")(0))와 그것에서 새 열을 추출 할 수있다

다른 생각

inputDF 
    .groupBy("MemberID") 
    .pivot("EncounterID", Seq("enc1", "enc2", "enc3")) 
    .agg(first("entry")).show 

+--------+----+----+----+ 
|MemberID|enc1|enc2|enc3| 
+--------+----+----+----+ 
| pid1| bat| | | 
| pid3| cat| | | 
+--------+----+----+----+ 
,536 : 경우

은 당신이 원하는 것은 당신이 피벗을 사용하여 해당 "만남"열에서 항목의 값을 넣어하는 것입니다

Seq("enc1", "enc2", "enc3")을 추가하는 것은 optionnal이지만 열 내용을 알고 있기 때문에 계산 속도가 빨라집니다.

+0

죄송합니다. 값을 하드 코딩 할 수 없으며, 이는 열에 어떤 값이 있는지에 따라 다릅니다. 그리고 내가 추가 할 수없는 한 가지 더 .. 특정 memberID에 대해서만 2 행 availble 다음 코드는 null로 3 열을 표시 할 수 있어야합니다. .. 나는 질문을 갱신 할 것이다. – Kalpesh

관련 문제