2017-02-26 3 views
7

spark-sql/pyspark의 테이블을 unpivot하려는 문제가 있습니다. 설명서를 읽었을 때 피벗 만 지원되지만 아직까지는 피벗을 지원하지 않는다는 것을 알 수있었습니다. 이것을 달성 할 수있는 방법이 있습니까?spark-sql/pyspark의 unpivot

내가 명령

df.groupBy("A").pivot("B").sum("C") 

에게 아래에 언급 된 사용 pyspark이 피벗 할 때 내 초기 테이블이

Let my initial table look like this

처럼 보자 I 출력

After pivot table looks like this

으로이를 얻을 수

이제 피벗 테이블을 피벗 해제하고 싶습니다. 일반적으로이 작업은 원래 테이블을 피벗 한 방식에 따라 원래 테이블을 생성 할 수도 있고 그렇지 않을 수도 있습니다.

현재 Spark-sql은 unpivot에 대한 지원을 즉시 제공하지 않습니다. 내가 이것을 달성 할 수있는 방법이 있습니까?

감사 마니

+0

필요한 결과를 포함하는 데이터 샘플을 추가하세요 –

+0

? ........................... –

+0

@DuduMarkovitz added now –

답변

13

당신은 스칼라에서, 예를 들어, 스택 기능을 내장 사용할 수 있습니다

scala> val df = Seq(("G",Some(4),2,None),("H",None,4,Some(5))).toDF("A","X","Y", "Z") 
df: org.apache.spark.sql.DataFrame = [A: string, X: int ... 2 more fields] 

scala> df.show 
+---+----+---+----+ 
| A| X| Y| Z| 
+---+----+---+----+ 
| G| 4| 2|null| 
| H|null| 4| 5| 
+---+----+---+----+ 


scala> df.select($"A", expr("stack(3, 'X', X, 'Y', Y, 'Z', Z) as (B, C)")).where("C is not null").show 
+---+---+---+ 
| A| B| C| 
+---+---+---+ 
| G| X| 4| 
| G| Y| 2| 
| H| Y| 4| 
| H| Z| 5| 
+---+---+---+ 

또는 pyspark에서

가 :

In [1]: df = spark.createDataFrame([("G",4,2,None),("H",None,4,5)],list("AXYZ")) 

In [2]: df.show() 
+---+----+---+----+ 
| A| X| Y| Z| 
+---+----+---+----+ 
| G| 4| 2|null| 
| H|null| 4| 5| 
+---+----+---+----+ 

In [3]: df.selectExpr("A", "stack(3, 'X', X, 'Y', Y, 'Z', Z) as (B, C)").where("C is not null").show() 
+---+---+---+ 
| A| B| C| 
+---+---+---+ 
| G| X| 4| 
| G| Y| 2| 
| H| Y| 4| 
| H| Z| 5| 
+---+---+---+ 
+0

위 답변에 해당하는 pyspark 코드를 제공해 주시겠습니까? – Afaq

+0

정말 고마워요. :) – Afaq

+0

여기 주어진 pyspark 코드를 사용해 보았지만 성능이 좋지 않은 것 같습니다. 모든 쿼리를 조합하여 피벗 팅을 수행하면이 코드와 비교할 때 성능이 향상되었습니다. 실적을 향상시키기 위해 여기서 할 수있는 조정이 있습니까? – Afaq

관련 문제