콘텐츠로 건너뛰기

Looker에서 PDT 만들기 / 설정 / 오류 해결

Looker에서 Persistent Derived Table(PDT)을 만들면서 겪었던 오류와 해결 방안에 대한 글입니다. 이 글에서는 Looker에서 PDT를 만드는 이유와 그 과정에 대해 자세히 알아보고, 실제 예시를 통해 어떻게 PDT를 설정하고 활용할 수 있는지 설명드리겠습니다.

■ PDT(Persistent Derived Table)란?

PDT(Persistent Derived Table)는 Looker에서 사용하는 강력한 기능 중 하나로, 복잡한 SQL 쿼리 결과를 기반으로 임시 테이블을 만들고 이를 데이터 모델링에 직접 사용할 수 있게 해주는 기능입니다. PDT를 사용하면 데이터 처리와 분석이 훨씬 유연하고 효율적으로 진행될 수 있습니다.

Q. 그냥 데이터베이스에서 테이블을 만들어서 하면 안되나요?
A. 데이터베이스에서 직접 테이블을 만들어 작업할 수도 있지만, Looker에서 PDT를 사용하면 여러 가지 이점이 있습니다. PDT를 사용하는 주요 이유는 다음과 같습니다.

  1. 유지보수의 편리함: Looker의 PDT는 LookML 모델 내에서 정의되기 때문에, 데이터 모델의 나머지 부분과 함께 중앙에서 관리할 수 있습니다. 보통 ETL은 엔지니어가 관리하기 때문에 분석가 입장에서 좀 더 간편하게 유지보수할 수 있습니다.
  2. 자동 업데이트: PDT는 설정된 트리거에 따라 자동으로 새로 고쳐집니다. 이는 데이터가 항상 최신 상태로 유지됨을 보장하며, 수동으로 테이블을 업데이트하는 번거로움을 줄여줍니다.
  3. 성능 최적화: Looker는 PDT를 생성할 때 데이터베이스의 부하를 최소화하는 방식으로 최적화합니다. 또한, 필요한 데이터만을 포함시켜 성능을 개선할 수 있습니다. 반면에, 직접 테이블을 만들고 관리하는 경우 성능 최적화를 위해 추가 작업이 필요할 수 있습니다.
  4. 보안과 권한 제어: Looker에서 PDT를 사용하면, Looker의 권한 시스템을 통해 누가 PDT에 접근할 수 있는지 세밀하게 제어할 수 있습니다. 데이터베이스 수준에서 이러한 제어를 구현하는 것은 종종 더 복잡합니다.
  5. 개발 속도: LookML을 사용하여 PDT를 정의하면, 복잡한 SQL 쿼리를 보다 쉽게 작성하고 관리할 수 있습니다. 이는 개발 과정을 가속화하고, 데이터 팀이 보다 신속하게 결과를 도출할 수 있도록 돕습니다.

■ Looker 어드민에서 PDT 설정 확인하기

PDT를 만들기 전에, 사용 중인 데이터베이스 연결 설정이 PDT 사용을 허용(Enable PDTs)하고 있는지 확인해야 합니다.

Looker 관리자 화면에서 데이터베이스 연결 설정을 점검하고, 필요한 권한이 설정되어 있는지 검토해야 합니다. 특히, Looker가 사용하는 서비스 계정이 데이터베이스에서 테이블 생성 등의 작업을 수행할 수 있는 충분한 권한을 가지고 있는지 (최소: BigQuery Data Editor나 BigQuery Job User) 확인해야 합니다.

그렇지 않다면 다음과 같은 에러 메시지를 볼 수 있습니다.

derived_table generated_dates creation failed: SQL Error in CREATE TABLE as SELECT: Error getting access token for service account: 400 Bad Request POST https://oauth2.googleapis.com/token {"error":"invalid_grant","error_description":"Invalid JWT Signature."}, iss:

저의 경우는 설정은 다 되어 있었으나 서비스 어카운트 키파일에 무슨 문제가 있었던지 재업로드하니까 문제가 해결되었습니다.

■ Looker에서 PDT 만들기

PDT를 만들 때는 LookML의 view 섹션에서 derived_table 파라미터를 사용합니다. 아래는 generated_dates라는 이름의 PDT를 만드는 예시입니다. 이 PDT는 2010년 1월 1일부터 2025년 12월 31일까지의 모든 날짜를 생성하고 각 날짜에 대한 고유 ID를 할당합니다.

sql_trigger_value에 여러 설정은 여기서 확인해주세요. https://cloud.google.com/looker/docs/reference/param-view-sql-trigger-value

view: generated_dates {
  derived_table: {
    sql_trigger_value: SELECT 1;;  # PDT 영구 생성 
    sql:
      SELECT
        DATE_DIFF(date, '2010-01-01', DAY) + 1 AS dwh_date_id,
        FORMAT_DATE('%Y-%m-%d', date) AS date_string
      FROM UNNEST(GENERATE_DATE_ARRAY('2010-01-01', '2025-12-31', INTERVAL 1 DAY)) AS date ;;
  }

  dimension: dwh_date_id {
    type: number
    sql: ${TABLE}.dwh_date_id ;;
  }

  dimension: date_string {
    type: string
    sql: ${TABLE}.date_string ;;
  }
}

태그: