ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [ ClickHouse ] arrayMap Function 알아보기
    Database/Clickhouse 2023. 9. 6. 13:12
    728x90
    반응형

    - 목차

     

    키워드.

    • - ArrayMap

     

     

    arrayMap 사용해보기.

    arrayMap 함수는 Array(String) 와 같은 Array 타입의 데이터를 대상으로 Map Function 을 적용할 수 있습니다.

    일종의 Array 의 각 Item 을 변형하는 Mapper 함수와 같이 동작합니다.

     

    간단한 활용 예시는 아래와 같습니다.

    user_actions 이라는 이름의 MergeTree 테이블을 생성하였구요.

    Array(String) 타입의 action 칼럼을 대상으로 arrayMap 함수를 적용합니다.

    create table default.user_actions
    (
        user     String,
        action   Array(String),
        acted_at DateTime
    ) engine = MergeTree()
    order by acted_at
    partition by toYYYYMM(acted_at);
    
    insert into default.user_actions (user, action, acted_at)
    values ('Aeron', ['Click', 'View', 'Remove'], '2024-01-01 00:00:00')

     

    아래 예시는 ['Click', 'View', 'Remove'] 라는 값을 가지는 Array(String) 타입의 action 칼럼에 arrayMap 함수를 적용하였습니다.

    map 함수를 사용하여 Map(String, String) 타입으로 action 값을 변형하기 위해서 사용하였구요.

    결과적으로 Array(Map(String, String)) 의 타입으로 데이터가 변형됩니다.

    select user, 
    	arrayMap(x -> map('name', x, 'lower_case', lower(x)), action) as actions
    from default.user_actions
    +-----+----------------------------
    |user |actions                     |
    +-----+----------------------------
    |Aeron|[                           |
    |     |{                           |
    |     |   "name": "Click",         |
    |     |   "lower_case": "click"    |
    |     |},                          |
    |     |{                           |
    |     |   "name": "View",          |
    |     |   "lower_case": "view"     |
    |     |},                          |
    |     |{                           |
    |     |   "name": "Remove",        |
    |     |   "lower_case": "remove"   |
    |     |}                           |
    |     |]                           |
    +-----+----------------------------+

     

     

    Array(Int) 타입에 arrayMap 적용하기.

    이번에는 구매 이력을 기록하는 purchase_log 라는 Table 을 생성합니다.

    create table default.purchase_log
    (
        user     String,
        amount   Int32,
        purchased_at DateTime
    ) engine = MergeTree()
          order by purchased_at
          partition by toYYYYMM(purchased_at);

     

    그리고 아래와 같이 Array(Int) 타입의 amounts 칼럼에 대해서 arrayMap 을 적용할 수 있습니다.

    아래 예시에서는 간단히 amount 의 10배를 취하는 Mapper Function 을 사용하였습니다.

    select user,
           groupArray(amount) as amounts,
           arrayMap(x -> x * 10, amounts) as new_amounts
    from default.purchase_log
    group by user

     

     

    둘 이상의 칼럼들을 arrayMap 적용하기.

    둘 이상의 칼럼들을 arrayMap 함수를 적용하여 하나의 칼럼으로 병합할 수 있습니다.

    아래 예시는 amounts, ten_times_amounts, hundred_times_amounts 라는 3개의 칼럼이 존재합니다.

    그리고 둘 이상의 칼럼을 하나의 arrayMap 에 적용할 수 있는데요.

    "arrayMap(x, y, z -> x + y + x, col1, col2, col3)" 이와 같은 방식으로 여러 칼럼을 하나의 칼럼으로 병합할 수 있습니다.

    select user,
           groupArray(amount) as amounts,
           arrayMap(x -> x * 10, amounts) as ten_times_amounts,
           arrayMap(x -> x * 100, amounts) as hundred_times_amounts,
           arrayMap(x, y, z -> x + y + x, amounts, ten_times_amounts, hundred_times_amounts) as output
    from default.purchase_log
    group by user

     

    아래의 결과에서 output 이라는 이름의 칼럼은 나머지 3개의 칼럼의 값들이 더한 값을 표현합니다.

    이는 3개의 칼럼의 각 값들을 Sum 하는 Mapper 함수를 사용하였기 때문입니다.

     

     

     

    반응형
Designed by Tistory.