Looker에서 Persistent Derived Table(PDT)을 만들면서 겪었던 오류와 해결 방안에 대한 글입니다. 이 글에서는 Looker에서 PDT를 만드는 이유와 그 과정에 대해 자세히 알아보고, 실제 예시를 통해 어떻게 PDT를 설정하고 활용할 수 있는지 설명드리겠습니다.
■ PDT(Persistent Derived Table)란?
PDT(Persistent Derived Table)는 Looker에서 사용하는 강력한 기능 중 하나로, 복잡한 SQL 쿼리 결과를 기반으로 임시 테이블을 만들고 이를 데이터 모델링에 직접 사용할 수 있게 해주는 기능입니다. PDT를 사용하면 데이터 처리와 분석이 훨씬 유연하고 효율적으로 진행될 수 있습니다.
Q. 그냥 데이터베이스에서 테이블을 만들어서 하면 안되나요?
A. 데이터베이스에서 직접 테이블을 만들어 작업할 수도 있지만, Looker에서 PDT를 사용하면 여러 가지 이점이 있습니다. PDT를 사용하는 주요 이유는 다음과 같습니다.
- 유지보수의 편리함: Looker의 PDT는 LookML 모델 내에서 정의되기 때문에, 데이터 모델의 나머지 부분과 함께 중앙에서 관리할 수 있습니다. 보통 ETL은 엔지니어가 관리하기 때문에 분석가 입장에서 좀 더 간편하게 유지보수할 수 있습니다.
- 자동 업데이트: PDT는 설정된 트리거에 따라 자동으로 새로 고쳐집니다. 이는 데이터가 항상 최신 상태로 유지됨을 보장하며, 수동으로 테이블을 업데이트하는 번거로움을 줄여줍니다.
- 성능 최적화: Looker는 PDT를 생성할 때 데이터베이스의 부하를 최소화하는 방식으로 최적화합니다. 또한, 필요한 데이터만을 포함시켜 성능을 개선할 수 있습니다. 반면에, 직접 테이블을 만들고 관리하는 경우 성능 최적화를 위해 추가 작업이 필요할 수 있습니다.
- 보안과 권한 제어: Looker에서 PDT를 사용하면, Looker의 권한 시스템을 통해 누가 PDT에 접근할 수 있는지 세밀하게 제어할 수 있습니다. 데이터베이스 수준에서 이러한 제어를 구현하는 것은 종종 더 복잡합니다.
- 개발 속도: LookML을 사용하여 PDT를 정의하면, 복잡한 SQL 쿼리를 보다 쉽게 작성하고 관리할 수 있습니다. 이는 개발 과정을 가속화하고, 데이터 팀이 보다 신속하게 결과를 도출할 수 있도록 돕습니다.
■ Looker 어드민에서 PDT 설정 확인하기
PDT를 만들기 전에, 사용 중인 데이터베이스 연결 설정이 PDT 사용을 허용(Enable PDTs)하고 있는지 확인해야 합니다.
![](https://lucy-the-marketer.kr/wp-content/uploads/2024/04/pdt_connection-1024x611.png)
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:
![](https://lucy-the-marketer.kr/wp-content/uploads/2024/04/pdt_connection_error_in_looker-1024x187.png)
저의 경우는 설정은 다 되어 있었으나 서비스 어카운트 키파일에 무슨 문제가 있었던지 재업로드하니까 문제가 해결되었습니다.
■ 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 ;; } }