AWS Glue에서 구체화된 뷰 사용
AWS Glue 버전 5.1 이상은 AWS Glue Data Catalog에서 Apache Iceberg 구체화된 뷰 생성 및 관리를 지원합니다. 구체화된 뷰는 SQL 쿼리의 사전 계산된 결과를 Apache Iceberg 형식으로 저장하고 기본 소스 테이블이 변경될 때 증분 업데이트하는 관리형 테이블입니다. 구체화된 뷰를 사용하여 데이터 변환 파이프라인을 간소화하고 복잡한 분석 워크로드의 쿼리 성능을 가속화할 수 있습니다.
AWS Glue에서 Spark를 사용하여 구체화된 뷰를 생성하면 뷰 정의와 메타데이터가 AWS Glue Data Catalog에 저장됩니다. 사전 계산된 결과는 계정 내의 Amazon S3 Tables 버킷 또는 Amazon S3 범용 버킷에 Apache Iceberg 테이블로 저장됩니다. AWS Glue Data Catalog는 관리형 컴퓨팅 인프라를 사용하여 소스 테이블을 자동으로 모니터링하고 구체화된 뷰를 새로 고칩니다.
주제
구체화된 뷰가 AWS Glue에서 작동하는 방식
구체화된 뷰는 AWS Glue 작업과 AWS Glue Studio 노트북에서 Apache Spark의 Iceberg 지원을 통해 AWS Glue와 통합됩니다. AWS Glue Data Catalog를 사용하도록 Spark 세션을 구성할 때 표준 SQL 구문을 사용하여 구체화된 뷰를 생성할 수 있습니다. Spark 옵티마이저는 더 나은 성능을 제공할 때 구체화된 뷰를 사용하도록 쿼리를 자동으로 재작성할 수 있으므로 애플리케이션 코드를 수동으로 수정할 필요가 없습니다.
AWS Glue Data Catalog는 다음을 포함하여 구체화된 뷰 유지 관리의 모든 운영 측면을 처리합니다.
-
Apache Iceberg의 메타데이터 계층을 사용하여 소스 테이블의 변경 사항 탐지
-
관리형 Spark 컴퓨팅을 사용하여 새로 고침 작업 예약 및 실행
-
데이터 변경을 기반으로 전체 새로 고침 수행 또는 증분 새로 고침 수행 여부 결정
-
다중 엔진 액세스를 위해 사전 계산된 결과를 Apache Iceberg 형식으로 저장
일반 테이블에 사용하는 것과 동일한 Spark SQL 인터페이스를 사용하여 AWS Glue에서 구체화된 뷰를 쿼리할 수 있습니다. Amazon Athena와 Amazon Redshift를 포함한 다른 서비스에서도 사전 계산된 데이터에 액세스할 수 있습니다.
사전 조건
AWS Glue에서 구체화된 뷰를 사용하려면 다음이 필요합니다.
-
계정
-
AWS Glue 버전 5.1 이상
-
AWS Glue Data Catalog에 등록된 Apache Iceberg 형식의 소스 테이블
-
소스 테이블 및 대상 데이터베이스에 대해 구성된 AWS Lake Formation 권한
-
구체화된 뷰 데이터 저장을 위해 AWS Lake Formation에 등록된 S3 Tables 버킷 또는 S3 범용 버킷
-
AWS Glue Data Catalog와 Amazon S3에 액세스할 수 있는 권한이 있는 IAM 역할
구체화된 뷰를 사용하도록 Spark 구성
AWS Glue에서 구체화된 뷰를 생성하고 관리하려면 필수 Iceberg 확장 및 카탈로그 설정으로 Spark 세션을 구성합니다. 구성 방법은 AWS Glue 작업을 사용하는지 아니면 AWS Glue Studio 노트북을 사용하는지에 따라 달라집니다.
AWS Glue 작업 구성
AWS Glue 작업을 생성하거나 업데이트할 때 다음 구성 파라미터를 작업 파라미터로 추가합니다.
S3 Tables 버킷의 경우
job = glue.create_job( Name='materialized-view-job', Role='arn:aws:iam::111122223333:role/GlueServiceRole', Command={ 'Name': 'glueetl', 'ScriptLocation': 's3://amzn-s3-demo-bucket/scripts/mv-script.py', 'PythonVersion': '3' }, DefaultArguments={ '--enable-glue-datacatalog': 'true', '--conf': 'spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions ' '--conf spark.sql.catalog.glue_catalog=org.apache.iceberg.spark.SparkCatalog ' '--conf spark.sql.catalog.glue_catalog.type=glue ' '--conf spark.sql.catalog.glue_catalog.warehouse=s3://amzn-s3-demo-bucket/warehouse ' '--conf spark.sql.catalog.glue_catalog.glue.region=us-east-1 ' '--conf spark.sql.catalog.glue_catalog.glue.id=111122223333 ' '--conf spark.sql.catalog.glue_catalog.glue.account-id=111122223333 ', '--conf spark.sql.catalog.glue_catalog.glue.lakeformation-enabled=true ', '--conf spark.sql.catalog.s3t_catalog=org.apache.iceberg.spark.SparkCatalog ' '--conf spark.sql.catalog.s3t_catalog.type=glue ' '--conf spark.sql.catalog.s3t_catalog.glue.id=111122223333:s3tablescatalog/my-table-bucket ', '--conf spark.sql.catalog.s3t_catalog.glue.account-id=111122223333 ', '--conf spark.sql.catalog.s3t_catalog.glue.lakeformation-enabled=true ', '--conf spark.sql.catalog.s3t_catalog.warehouse=s3://amzn-s3-demo-bucket/mv-warehouse ' '--conf spark.sql.catalog.s3t_catalog.glue.region=us-east-1 ' '--conf spark.sql.defaultCatalog=s3t_catalog ' '--conf spark.sql.optimizer.answerQueriesWithMVs.enabled=true ' '--conf spark.sql.materializedViews.metadataCache.enabled=true' }, GlueVersion='5.1' )
S3 범용 버킷의 경우
job = glue.create_job( Name='materialized-view-job', Role='arn:aws:iam::111122223333:role/GlueServiceRole', Command={ 'Name': 'glueetl', 'ScriptLocation': 's3://amzn-s3-demo-bucket/scripts/mv-script.py', 'PythonVersion': '3' }, DefaultArguments={ '--enable-glue-datacatalog': 'true', '--conf': 'spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions ' '--conf spark.sql.catalog.glue_catalog=org.apache.iceberg.spark.SparkCatalog ' '--conf spark.sql.catalog.glue_catalog.type=glue ' '--conf spark.sql.catalog.glue_catalog.warehouse=s3://amzn-s3-demo-bucket/warehouse ' '--conf spark.sql.catalog.glue_catalog.glue.region=us-east-1 ' '--conf spark.sql.catalog.glue_catalog.glue.id=111122223333 ', '--conf spark.sql.catalog.glue_catalog.glue.account-id=111122223333 ', '--conf spark.sql.catalog.glue_catalog.glue.lakeformation-enabled=true ', '--conf spark.sql.defaultCatalog=glue_catalog ' '--conf spark.sql.optimizer.answerQueriesWithMVs.enabled=true ' '--conf spark.sql.materializedViews.metadataCache.enabled=true' }, GlueVersion='5.1' )
AWS Glue Studio 노트북 구성
AWS Glue Studio 노트북에서 노트북 시작 부분에 있는 %%configure 매직 명령을 사용하여 Spark 세션을 구성합니다.
%%configure { "conf": { "spark.sql.extensions": "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions", "spark.sql.catalog.glue_catalog": "org.apache.iceberg.spark.SparkCatalog", "spark.sql.catalog.glue_catalog.type": "glue", "spark.sql.catalog.glue_catalog.warehouse": "s3://amzn-s3-demo-bucket/warehouse", "spark.sql.catalog.glue_catalog.glue.region": "us-east-1", "spark.sql.catalog.glue_catalog.glue.id": "111122223333", "spark.sql.catalog.glue_catalog.glue.account-id": "111122223333", "spark.sql.catalog.glue_catalog.glue.lakeformation-enabled": "true", "spark.sql.defaultCatalog": "glue_catalog", "spark.sql.optimizer.answerQueriesWithMVs.enabled": "true", "spark.sql.materializedViews.metadataCache.enabled": "true" } }
증분 새로 고침 활성화
증분 새로 고침 최적화를 활성화하려면 작업 파라미터 또는 노트북 구성에 다음 구성 속성을 추가합니다.
--conf spark.sql.optimizer.incrementalMVRefresh.enabled=true --conf spark.sql.optimizer.incrementalMVRefresh.deltaThresholdCheckEnabled=false
구성 파라미터
다음 구성 파라미터는 구체화된 뷰 동작을 제어합니다.
-
spark.sql.extensions- 구체화된 뷰 지원에 필요한 Iceberg Spark 세션 확장을 활성화합니다. -
spark.sql.optimizer.answerQueriesWithMVs.enabled- 구체화된 뷰를 사용하기 위한 자동 쿼리 재작성을 활성화합니다. 이 최적화를 활성화하려면 true로 설정합니다. -
spark.sql.materializedViews.metadataCache.enabled- 쿼리 최적화를 위해 구체화된 뷰 메타데이터의 캐싱을 활성화합니다. 쿼리 재작성 성능을 개선하려면 true로 설정합니다. -
spark.sql.optimizer.incrementalMVRefresh.enabled- 증분 새로 고침 최적화를 활성화합니다. 새로 고침 작업 중에 변경된 데이터만 처리하려면 true로 설정합니다. -
spark.sql.optimizer.answerQueriesWithMVs.decimalAggregateCheckEnabled- 쿼리 재작성 시 십진수 집계 작업의 유효성 검사를 제어합니다. 특정 십진수 오버플로 검사를 비활성화하려면 false로 설정합니다.
구체화된 뷰 생성
AWS Glue 작업 또는 노트북에서 CREATE MATERIALIZED VIEW SQL 문을 사용하여 구체화된 뷰를 생성합니다. 뷰 정의는 변환 로직을 하나 이상의 소스 테이블을 참조하는 SQL 쿼리로 지정합니다.
AWS Glue 작업에서 기본 구체화된 뷰 생성
다음 예제에서는 AWS Glue 작업 스크립트에서 구체화된 뷰를 생성하는 방법을 보여 줍니다. 뷰 정의에서 3가지 부분으로 구성된 이름 지정 규칙으로 정규화된 테이블 이름을 사용합니다.
from awsglue.context import GlueContext from pyspark.context import SparkContext sc = SparkContext() glueContext = GlueContext(sc) spark = glueContext.spark_session # Create materialized view spark.sql(""" CREATE MATERIALIZED VIEW customer_orders AS SELECT customer_name, COUNT(*) as order_count, SUM(amount) as total_amount FROM glue_catalog.sales.orders GROUP BY customer_name """)
자동 새로 고침을 사용하여 구체화된 뷰 생성
자동 새로 고침을 구성하려면 뷰 정의에서 3가지 부분으로 구성된 이름 지정 규칙으로 정규화된 테이블 이름을 사용하여 뷰를 생성할 때 새로 고침 일정을 지정합니다.
spark.sql(""" CREATE MATERIALIZED VIEW customer_orders SCHEDULE REFRESH EVERY 1 HOUR AS SELECT customer_name, COUNT(*) as order_count, SUM(amount) as total_amount FROM glue_catalog.sales.orders GROUP BY customer_name """)
카탈로그 간 참조를 사용하여 구체화된 뷰 생성
소스 테이블이 구체화된 뷰와 다른 카탈로그에 있는 경우 뷰 이름과 뷰 정의 모두에서 3가지 부분으로 구성된 이름 지정 규칙으로 정규화된 테이블 이름을 사용합니다.
spark.sql(""" CREATE MATERIALIZED VIEW s3t_catalog.analytics.customer_summary AS SELECT customer_name, COUNT(*) as order_count, SUM(amount) as total_amount FROM glue_catalog.sales.orders GROUP BY customer_name """)
AWS Glue Studio 노트북에서 구체화된 뷰 생성
AWS Glue Studio 노트북에서는 %%sql 매직 명령을 사용하여 뷰 정의에서 3가지 부분으로 구성된 이름 지정 규칙으로 정규화된 테이블 이름을 사용하여 구체화된 뷰를 생성할 수 있습니다.
%%sql CREATE MATERIALIZED VIEW customer_orders AS SELECT customer_name, COUNT(*) as order_count, SUM(amount) as total_amount FROM glue_catalog.sales.orders GROUP BY customer_name
구체화된 뷰 쿼리
구체화된 뷰를 생성한 후 AWS Glue 작업 또는 노트북에서 표준 SQL SELECT 문을 사용하여 다른 테이블처럼 쿼리할 수 있습니다.
AWS Glue 작업에서 쿼리
from awsglue.context import GlueContext from pyspark.context import SparkContext sc = SparkContext() glueContext = GlueContext(sc) spark = glueContext.spark_session # Query materialized view result = spark.sql("SELECT * FROM customer_orders") result.show()
AWS Glue Studio 노트북에서 쿼리
%%sql SELECT * FROM customer_orders
자동 쿼리 재작성
자동 쿼리 재작성이 활성화되면 Spark 옵티마이저는 쿼리를 분석하여 성능을 개선할 수 있을 때 구체화된 뷰를 자동으로 사용합니다. 예를 들어 다음 쿼리를 실행하는 경우:
result = spark.sql(""" SELECT customer_name, COUNT(*) as order_count, SUM(amount) as total_amount FROM orders GROUP BY customer_name """)
Spark 옵티마이저는 구체화된 뷰가 최신 상태인 경우 기본 주문 테이블을 처리하는 대신 customer_orders 구체화된 뷰를 사용하도록 이 쿼리를 자동으로 재작성합니다.
자동 쿼리 재작성 확인
쿼리가 자동 쿼리 재작성을 사용하는지 확인하려면 EXPLAIN EXTENDED 명령을 사용합니다.
spark.sql(""" EXPLAIN EXTENDED SELECT customer_name, COUNT(*) as order_count, SUM(amount) as total_amount FROM orders GROUP BY customer_name """).show(truncate=False)
실행 계획의 BatchScan 작업에서 구체화된 뷰 이름을 찾습니다. 계획에 BatchScan glue_catalog.sales.orders 대신 BatchScan glue_catalog.analytics.customer_orders가 표시되면 구체화된 뷰를 사용하도록 쿼리가 자동으로 재작성된 것입니다.
자동 쿼리 재작성은 구체화된 뷰를 생성한 후 Spark 메타데이터 캐시가 채워지는 데 시간이 걸립니다. 이 프로세스는 일반적으로 30초 내에 완료됩니다.
구체화된 뷰 새로 고침
전체 새로 고침과 증분 새로 고침이라는 2가지 방법을 사용하여 구체화된 뷰를 새로 고칠 수 있습니다. 전체 새로 고침은 모든 기본 테이블 데이터에서 전체 구체화된 뷰를 다시 계산하는 반면, 증분 새로 고침은 마지막 새로 고침 이후 변경된 데이터만 처리합니다.
AWS Glue 작업에서 수동 전체 새로 고침
구체화된 뷰의 전체 새로 고침을 수행하려면
spark.sql("REFRESH MATERIALIZED VIEW customer_orders FULL") # Verify updated results result = spark.sql("SELECT * FROM customer_orders") result.show()
AWS Glue 작업에서 수동 증분 새로 고침
증분 새로 고침을 수행하려면 Spark 세션 구성에서 증분 새로 고침이 활성화되어 있는지 확인한 후 다음을 실행합니다.
spark.sql("REFRESH MATERIALIZED VIEW customer_orders") # Verify updated results result = spark.sql("SELECT * FROM customer_orders") result.show()
AWS Glue Data Catalog는 뷰 정의와 변경된 데이터의 양을 기반으로 증분 새로 고침의 적용 여부를 자동으로 결정합니다. 증분 새로 고침이 불가능한 경우 작업은 전체 새로 고침으로 돌아갑니다.
AWS Glue Studio 노트북에서 새로 고침
노트북에서 %%sql 매직 명령을 사용합니다.
%%sql REFRESH MATERIALIZED VIEW customer_orders FULL
증분 새로 고침 실행 확인
증분 새로 고침이 성공적으로 실행되었는지 확인하려면 AWS Glue 작업에서 디버그 로깅을 활성화합니다.
from awsglue.context import GlueContext from pyspark.context import SparkContext import logging sc = SparkContext() glueContext = GlueContext(sc) spark = glueContext.spark_session # Enable debug logging logger = logging.getLogger('org.apache.spark.sql') logger.setLevel(logging.DEBUG) # Execute refresh spark.sql("REFRESH MATERIALIZED VIEW customer_orders")
AWS Glue 작업 로그에서 다음 메시지를 검색합니다.
DEBUG RefreshMaterializedViewExec: Executed Incremental Refresh
구체화된 뷰 관리
AWS Glue는 작업과 노트북에서 구체화된 뷰의 수명 주기를 관리하기 위한 SQL 명령을 제공합니다.
구체화된 뷰 설명
정의, 새로 고침 상태, 마지막 새로 고침 타임스탬프를 포함하여 구체화된 뷰에 대한 메타데이터를 보려면:
spark.sql("DESCRIBE EXTENDED customer_orders").show(truncate=False)
구체화된 뷰 변경
기존 구체화된 뷰의 새로 고침 일정을 수정하려면
spark.sql(""" ALTER MATERIALIZED VIEW customer_orders ADD SCHEDULE REFRESH EVERY 2 HOURS """)
자동 새로 고침을 제거하려면
spark.sql(""" ALTER MATERIALIZED VIEW customer_orders DROP SCHEDULE """)
구체화된 뷰 삭제
구체화된 뷰를 삭제하려면
spark.sql("DROP MATERIALIZED VIEW customer_orders")
이 명령은 AWS Glue Data Catalog에서 구체화된 뷰 정의를 제거하고 S3 버킷에서 기본 Iceberg 테이블 데이터를 삭제합니다.
구체화된 뷰 나열
데이터베이스에서 모든 구체화된 뷰를 나열하려면
spark.sql("SHOW VIEWS FROM analytics").show()
구체화된 뷰에 대한 권한
구체화된 뷰를 생성하고 관리하려면 AWS Lake Formation 권한을 구성해야 합니다. 구체화된 뷰를 생성하는 IAM 역할(정의자 역할)에는 소스 테이블 및 대상 데이터베이스에 대한 특정 권한이 필요합니다.
정의자 역할에 필요한 권한
정의자 역할에는 다음과 같은 Lake Formation 권한이 있어야 합니다.
-
소스 테이블에서 - 행, 열 또는 셀 필터가 없는 SELECT 또는 ALL 권한
-
대상 데이터베이스에서 - CREATE_TABLE 권한
-
AWS Glue Data Catalog에서 - GetTable 및 CreateTable API 권한
구체화된 뷰를 생성하면 정의자 역할의 ARN이 뷰 정의에 저장됩니다. AWS Glue Data Catalog는 자동 새로 고침 작업을 실행할 때 이 역할을 수임합니다. 정의자 역할이 소스 테이블에 대한 액세스 권한을 상실하면 권한이 복원될 때까지 새로 고침 작업이 실패합니다.
AWS Glue 작업을 위한 IAM 권한
AWS Glue 작업의 IAM 역할에는 다음 권한이 필요합니다.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "glue:GetCatalog", "glue:GetCatalogs", "glue:GetTable", "glue:GetTables", "glue:CreateTable", "glue:UpdateTable", "glue:DeleteTable", "glue:GetDatabase", "glue:GetDatabases", "cloudwatch:PutMetricData" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject", "s3:DeleteObject" ], "Resource": [ "arn:aws:s3:::amzn-s3-demo-bucket/*" ] }, { "Effect": "Allow", "Action": [ "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::amzn-s3-demo-bucket" ] }, { "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": [ "arn:aws:logs:*:*:*:/aws-glue/*" ] }, { "Effect": "Allow", "Action": [ "lakeformation:GetDataAccess" ], "Resource": "*" } ] }
구체화된 뷰 자동 새로 고침에 사용하는 역할에는 역할에 대한 iam:PassRole 권한이 있어야 합니다.
{ "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iam:PassRole" ], "Resource": [ "arn:aws:iam::111122223333:role/materialized-view-role-name" ] } ] }
Glue가 구체화된 뷰를 자동으로 새로 고치도록 하려면 서비스가 역할을 수임할 수 있도록 하는 다음과 같은 신뢰 정책도 역할에 있어야 합니다.
{ "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iam:PassRole" ], "Resource": [ "arn:aws:iam::111122223333:role/materialized-view-role-name" ] } ] }
구체화된 뷰가 S3 Tables 버킷에 저장된 경우 역할에 다음 권한도 추가해야 합니다.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3tables:PutTableMaintenanceConfiguration" ], "Resource": "arn:aws:s3tables:*:123456789012:*" } ] }
구체화된 뷰에 대한 액세스 권한 부여
구체화된 뷰를 쿼리할 수 있는 액세스 권한을 다른 사용자에게 부여하려면 AWS Lake Formation을 사용하여 구체화된 뷰 테이블에 대한 SELECT 권한을 부여합니다. 사용자는 기본 소스 테이블에 직접 액세스할 필요 없이 구체화된 뷰를 쿼리할 수 있습니다.
자세한 내용은 AWS Lake Formation 개발자 안내서의 데이터 카탈로그 리소스에 대한 권한 부여를 참조하세요.
구체화된 뷰 작업 모니터링
AWS Glue Data Catalog는 구체화된 뷰 새로 고침 작업의 지표와 로그를 Amazon CloudWatch에 게시합니다. CloudWatch 지표를 통해 새로 고침 상태, 기간, 처리되는 데이터 볼륨을 모니터링할 수 있습니다.
작업 로그 보기
구체화된 뷰를 생성하거나 새로 고치는 AWS Glue 작업 로그를 보려면:
-
AWS Glue 콘솔을 엽니다.
-
탐색 창에서 작업을 선택합니다.
-
작업을 선택하고 실행을 선택합니다.
-
특정 실행을 선택하고 로그를 선택하여 CloudWatch 로그를 봅니다.
경보 설정
새로 고침 작업이 실패하거나 예상 기간을 초과할 때 알림을 받으려면 구체화된 뷰 지표에 대한 CloudWatch 경보를 생성합니다. Amazon EventBridge 규칙을 구성하여 새로 고침 이벤트에 대한 자동 응답을 트리거할 수도 있습니다.
예제: 전체 워크플로
다음 예제는 AWS Glue에서 구체화된 뷰를 생성하고 사용하기 위한 전체 워크플로를 보여줍니다.
AWS Glue 작업 스크립트 예제
import sys from awsglue.transforms import * from awsglue.utils import getResolvedOptions from pyspark.context import SparkContext from awsglue.context import GlueContext from awsglue.job import Job args = getResolvedOptions(sys.argv, ['JOB_NAME']) sc = SparkContext() glueContext = GlueContext(sc) spark = glueContext.spark_session job = Job(glueContext) job.init(args['JOB_NAME'], args) # Create database and base table spark.sql("CREATE DATABASE IF NOT EXISTS sales") spark.sql("USE sales") spark.sql(""" CREATE TABLE IF NOT EXISTS orders ( id INT, customer_name STRING, amount DECIMAL(10,2), order_date DATE ) """) # Insert sample data spark.sql(""" INSERT INTO orders VALUES (1, 'John Doe', 150.00, DATE('2024-01-15')), (2, 'Jane Smith', 200.50, DATE('2024-01-16')), (3, 'Bob Johnson', 75.25, DATE('2024-01-17')) """) # Create materialized view spark.sql(""" CREATE MATERIALIZED VIEW customer_summary AS SELECT customer_name, COUNT(*) as order_count, SUM(amount) as total_amount FROM glue_catalog.sales.orders GROUP BY customer_name """) # Query the materialized view print("Initial materialized view data:") spark.sql("SELECT * FROM customer_summary").show() # Insert additional data spark.sql(""" INSERT INTO orders VALUES (4, 'Jane Smith', 350.00, DATE('2024-01-18')), (5, 'Bob Johnson', 100.25, DATE('2024-01-19')) """) # Refresh the materialized view spark.sql("REFRESH MATERIALIZED VIEW customer_summary FULL") # Query updated results print("Updated materialized view data:") spark.sql("SELECT * FROM customer_summary").show() job.commit()
AWS Glue Studio 노트북 예제
%%configure { "conf": { "spark.sql.extensions": "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions", "spark.sql.catalog.glue_catalog": "org.apache.iceberg.spark.SparkCatalog", "spark.sql.catalog.glue_catalog.type": "glue", "spark.sql.catalog.glue_catalog.warehouse": "s3://amzn-s3-demo-bucket/warehouse", "spark.sql.catalog.glue_catalog.glue.region": "us-east-1", "spark.sql.catalog.glue_catalog.glue.id": "111122223333", "spark.sql.catalog.glue_catalog.glue.account-id": "111122223333", "spark.sql.catalog.glue_catalog.glue.lakeformation-enabled": "true", "spark.sql.defaultCatalog": "glue_catalog", "spark.sql.optimizer.answerQueriesWithMVs.enabled": "true", "spark.sql.materializedViews.metadataCache.enabled": "true" } }
%%sql CREATE DATABASE IF NOT EXISTS sales
%%sql USE sales
%%sql CREATE TABLE IF NOT EXISTS orders ( id INT, customer_name STRING, amount DECIMAL(10,2), order_date DATE )
%%sql INSERT INTO orders VALUES (1, 'John Doe', 150.00, DATE('2024-01-15')), (2, 'Jane Smith', 200.50, DATE('2024-01-16')), (3, 'Bob Johnson', 75.25, DATE('2024-01-17'))
%%sql CREATE MATERIALIZED VIEW customer_summary AS SELECT customer_name, COUNT(*) as order_count, SUM(amount) as total_amount FROM glue_catalog.sales.orders GROUP BY customer_name
%%sql SELECT * FROM customer_summary
%%sql INSERT INTO orders VALUES (4, 'Jane Smith', 350.00, DATE('2024-01-18')), (5, 'Bob Johnson', 100.25, DATE('2024-01-19'))
%%sql REFRESH MATERIALIZED VIEW customer_summary FULL
%%sql SELECT * FROM customer_summary
고려 사항 및 제한
AWS Glue에서 구체화된 뷰를 사용할 때는 다음 사항을 고려하세요.
-
구체화된 뷰를 사용하려면 AWS Glue 버전 5.1 이상이 필요합니다.
-
소스 테이블은 AWS Glue Data Catalog에 등록된 Apache Iceberg 테이블이어야 합니다. Apache Hive, Apache Hudi, Linux Foundation Delta Lake 테이블은 시작 시 지원되지 않습니다.
-
소스 테이블은 구체화된 뷰와 동일한 리전 및 계정에 있어야 합니다.
-
모든 소스 테이블은 AWS Lake Formation에서 관리해야 합니다. IAM 전용 권한과 하이브리드 액세스는 지원되지 않습니다.
-
구체화된 뷰는 AWS Glue Data Catalog 뷰, 다중 언어 뷰 또는 기타 구체화된 뷰를 소스 테이블로 참조할 수 없습니다.
-
뷰 정의자 역할에는 행, 열 또는 셀 필터가 적용되지 않은 모든 소스 테이블에 대한 전체 읽기 액세스 권한(SELECT 또는 ALL 권한)이 있어야 합니다.
-
구체화된 뷰는 소스 테이블과 최종적으로 일관됩니다. 새로 고침 기간 동안 쿼리는 오래된 데이터를 반환할 수 있습니다. 즉각적인 일관성을 위해 수동 새로 고침을 실행합니다.
-
최소 자동 새로 고침 간격은 1시간입니다.
-
증분 새로 고침은 제한된 SQL 작업 하위 집합을 지원합니다. 뷰 정의는 단일 SELECT-FROM-WHERE-GROUP BY-HAVING 블록이어야 하며, 설정 작업, 하위 쿼리, SELECT 또는 집계 함수의 DISTINCT 키워드, 창 함수 또는 INNER JOIN 이외의 조인을 포함할 수 없습니다.
-
증분 새로 고침은 사용자 정의 함수 또는 특정 내장 함수를 지원하지 않습니다. Spark SQL 내장 함수의 하위 집합만 지원됩니다.
-
쿼리 자동 재작성은 증분 새로 고침 제한과 유사한 제한된 SQL 하위 집합에 정의가 속하는 구체화된 뷰만 고려합니다.
-
영숫자와 밑줄 이외의 특수 문자가 포함된 식별자는 CREATE MATERIALIZED VIEW 쿼리에서 지원되지 않습니다. 이는 카탈로그/네임스페이스/테이블 이름, 열 및 구조체 필드 이름, CTE, 별칭을 포함한 모든 식별자 유형에 적용됩니다.
-
__ivm 접두사로 시작하는 구체화된 뷰 열은 시스템용으로 예약되어 있습니다. Amazon은 향후 릴리스에서 이러한 열을 수정하거나 제거할 수 있는 권한을 보유합니다.
-
SORT BY, LIMIT, OFFSET, CLUSTER BY, ORDER BY 절은 구체화된 뷰 정의에서 지원되지 않습니다.
-
교차 리전 및 교차 계정 소스 테이블은 지원되지 않습니다.
-
자동 새로 고침은 기본 카탈로그 및 데이터베이스 설정을 사용하지 않으므로 뷰 쿼리에서 참조되는 테이블은 3가지 부분으로 구성된 이름 지정 규칙(예: glue_catalog.my_db.my_table)을 사용해야 합니다.
-
전체 새로 고침 작업은 전체 테이블을 재정의하고 이전 스냅샷을 사용할 수 없게 만듭니다.
-
rand() 또는 current_timestamp()와 같은 비결정적 함수는 구체화된 뷰 정의에서 지원되지 않습니다.