복붙노트

[HADOOP] 스파크 데이터 프레임 : 기둥 기반 피벗 및 그룹

HADOOP

스파크 데이터 프레임 : 기둥 기반 피벗 및 그룹

ID, 앱 및 고객이 아래와 같이 데이터 프레임을 입력했습니다.

입력 데이터 프레임

+--------------------+-----+---------+
|                  id|app  |customer |
+--------------------+-----+---------+
|id1                 |   fw|     WM  |
|id1                 |   fw|     CS  |
|id2                 |   fw|     CS  |
|id1                 |   fe|     WM  |
|id3                 |   bc|     TR  |
|id3                 |   bc|     WM  |
+--------------------+-----+---------+

예상 결과

피벗 및 집계 사용 - 앱 이름을 열 이름으로 만들고 집계 된 고객 이름을 데이터 프레임의 목록으로 지정

예상 데이터 프레임

+--------------------+----------+-------+----------+
|                  id|   bc     |     fe|    fw    |
+--------------------+----------+-------+----------+
|id1                 |  0       |     WM|   [WM,CS]|
|id2                 |  0       |      0|   [CS]   |
|id3                 | [TR,WM]  |      0|      0   |
+--------------------+----------+-------+----------+

나는 무엇을 시도 했는가?

+--------------------+-----+-------+------+
|                  id|bc   |     fe|    fw|
+--------------------+-----+-------+------+
|id1                 |  0  |     WM|    WM|
|id2                 |  0  |      0|    CS|
|id3                 | TR  |      0|     0|
+--------------------+-----+-------+------+

문제 : 내 쿼리에서 'fw'아래에 'id1'에 대해 [WM, CS]와 같은 고객 목록을 가져올 수 없습니다 (예상 결과에 표시된 것과 같이). "WM"만 제공됩니다. 마찬가지로 "id3"의 경우 "TR"만 나타나고 대신 "id3"의 경우 "bc"아래에 [TR, WM] 값이있는 목록이 나타납니다

각 앱에서 고객 목록을 얻으려면 제안이 필요합니다.

해결법

  1. ==============================

    1.셀이 0이어야하는 셀에서 빈 목록을 사용할 수있는 경우 collect_list를 사용할 수 있습니다.

    셀이 0이어야하는 셀에서 빈 목록을 사용할 수있는 경우 collect_list를 사용할 수 있습니다.

    df.groupBy("id").pivot("app").agg(collect_list("customer")).show
    +---+--------+----+--------+
    | id|      bc|  fe|      fw|
    +---+--------+----+--------+
    |id3|[TR, WM]|  []|      []|
    |id1|      []|[WM]|[CS, WM]|
    |id2|      []|  []|    [CS]|
    +---+--------+----+--------+
    
  2. ==============================

    2.CONCAT_WS를 사용하면 배열을 분해 할 수 있고 대괄호를 제거 할 수 있습니다.

    CONCAT_WS를 사용하면 배열을 분해 할 수 있고 대괄호를 제거 할 수 있습니다.

    df.groupBy("id").pivot("app").agg(concat_ws(",",collect_list("customer")))
    
  3. from https://stackoverflow.com/questions/46228331/spark-dataframe-pivot-and-group-based-on-columns by cc-by-sa and MIT license