Snowflake Horizon Catalog를 통해 외부 엔진이 있는 Apache Iceberg™ 테이블 쿼리하기¶
Snowflake Horizon Catalog를 통해 외부 쿼리 엔진을 사용하여 Snowflake 관리 Apache Iceberg™ 테이블을 쿼리합니다. 외부 엔진과의 이러한 상호 운용성을 보장하기 위해 `Apache Polaris™(인큐베이팅) <https://github.com/apache/polaris>`_가 Horizon Catalog에 통합되었습니다. 또한, Horizon Catalog는 Apache Iceberg™ REST API(Horizon Iceberg REST Catalog API)를 노출합니다. 이러한 API를 통해 외부 쿼리 엔진을 사용하여 테이블을 읽을 수 있습니다.
외부 쿼리 엔진으로 Snowflake 관리 Iceberg 테이블을 쿼리하려면 :doc:`Snowflake 관리 Iceberg 테이블을 Snowflake Open Catalog와 동기화</user-guide/tables-iceberg-open-catalog-sync>`하는 대신 이 기능을 사용하면 됩니다. Open Catalog에 대한 자세한 내용은 :doc:`Snowflake Open Catalog 개요</user-guide/opencatalog/overview>`를 참조하세요.
Horizon Catalog를 통해 외부 쿼리 엔진을 Iceberg 테이블에 연결하면 다음 작업을 수행할 수 있습니다.
Apache Spark™와 같은 개방형 Iceberg REST 프로토콜을 지원하는 외부 쿼리 엔진을 사용하여 해당 테이블을 쿼리할 수 있습니다.
단일 Horizon Catalog 엔드포인트를 사용하여 신규 또는 기존 Snowflake 계정에서 기존 및 신규 Snowflake 관리 Iceberg 테이블을 쿼리합니다.
Snowflake의 기존 사용자, 역할, 정책 및 인증을 사용하여 테이블을 쿼리합니다.
발급된 자격 증명을 사용합니다.
Snowflake Horizon Catalog에 대한 자세한 내용은 Snowflake Horizon Catalog 섹션을 참조하세요.
다음 다이어그램은 Horizon Catalog를 통해 Snowflake 관리 Iceberg 테이블을 읽고 Snowflake가 이러한 테이블을 읽고 쓰는 외부 쿼리 엔진을 보여줍니다.
청구¶
Horizon Iceberg REST Catalog API는 모든 Snowflake 에디션에서 사용할 수 있습니다.
API 요청은 100만 호출당 0.5 크레딧으로 청구되며 클라우드 서비스로 청구됩니다.
리전 간 데이터 액세스의 경우 `Snowflake Service Consumption Table`_에 명시된 대로 표준 리전 간 데이터 송신 요금이 적용됩니다.
참고
이 기능에 대한 청구는 2026년 중반부터 시작될 예정이며 변경될 수 있습니다.
지원되는 외부 엔진 및 카탈로그¶
다음 테이블에서는 완전하지는 않지만 Horizon Iceberg REST Catalog API와 통합되는 많은 외부 엔진과 카탈로그를 보여줍니다. 이러한 통합을 통해 외부 시스템을 사용하여 Snowflake 관리 Iceberg 테이블에 액세스할 수 있습니다.
지원되는 외부 엔진¶
다음 외부 쿼리 엔진은 Horizon Iceberg REST Catalog API와 통합됩니다.
제품 |
Horizon Catalog를 통해 Snowflake 관리 Iceberg 테이블에 액세스 |
|---|---|
Apache Doris™ |
✔ |
Apache Flink™ |
✔ |
Apache Spark™ |
✔ |
Dremio |
✔ |
DuckDB |
✔ |
PyIceberg |
✔ |
StarRocks |
✔ |
Trino |
✔ |
지원되는 외부 카탈로그¶
다음 외부 카탈로그는 Horizon Iceberg REST Catalog API와 통합됩니다.
제품 |
Horizon Catalog를 통해 Snowflake 관리 Iceberg 테이블에 액세스 |
설명 |
|---|---|---|
Apache Polaris™ |
✔ |
|
AWS Glue |
✔ |
이러한 통합을 구성하는 방법에 대한 지침은 AWS Big Data 블로그의 `AWS Glue Data Catalog에서 카탈로그 페더레이션을 사용하여 Snowflake Horizon Catalog 데이터에 액세스 <https://aws.amazon.com/blogs/big-data/access-snowflake-horizon-catalog-data-using-catalog-federation-in-the-aws-glue-data-catalog/>`_를 참조하세요. |
Palantir Foundry |
✔ |
이러한 통합을 구성하는 방법에 대한 지침은 Palantir 설명서의 `Iceberg 테이블(가상 테이블만 해당) <https://www.palantir.com/docs/foundry/available-connectors/snowflake#iceberg-tables-virtual-tables-only>`_을 참조하세요. |
Databricks Unity 카탈로그 |
발표되지 않음 |
|
Google BigLake Metastore |
개발 중 |
|
Microsoft Fabric/Synapse |
개발 중 |
전제 조건¶
쿼리하려는 Iceberg 테이블이 포함된 Snowflake 계정의 계정 식별자를 검색합니다. 자세한 지침은 계정 식별자 섹션을 참조하십시오. :ref:`외부 쿼리 엔진을 Iceberg 테이블에 연결<label-tables_iceberg_query_using_external_query_engine_snowflake_horizon_connect_external_query_engine>`할 때 이 식별자를 지정합니다.
팁
SQL을 사용하여 계정 식별자를 가져오려면 다음 명령을 실행하면 됩니다.
SELECT CURRENT_ORGANIZATION_NAME() || '-' || CURRENT_ACCOUNT_NAME();
(선택 사항) 비공개 연결¶
보안 연결을 위해 Horizon Catalog 엔드포인트에 액세스하는 동안 Snowflake 계정에 대한 인바운드 및 아웃바운드 비공개 연결을 구성하는 것이 좋습니다.
참고
비공개 연결은 Amazon S3 또는 Azure Storage(ADLS)에 저장된 Snowflake 관리 Iceberg 테이블에만 지원됩니다.
외부 쿼리 엔진을 사용하여 Iceberg 테이블을 쿼리하는 워크플로¶
외부 쿼리 엔진을 사용하여 Iceberg 테이블을 쿼리하려면 다음 단계를 완료합니다.
1단계: Iceberg 테이블 만들기¶
중요
쿼리할 Snowflake 관리 Iceberg 테이블이 이미 있는 경우 이 단계를 건너뛸 수 있습니다.
이 단계에서는 Snowflake를 카탈로그로 사용하는 Snowflake 관리 Iceberg 테이블을 생성하여 외부 쿼리 엔진으로 쿼리할 수 있습니다. 구체적인 지침은 다음 항목을 참조하십시오.
자습서: 첫 번째 Apache Iceberg™ 테이블 만들기: 데이터베이스를 만들고, Snowflake 관리 Iceberg 테이블을 만들고, 테이블에 데이터를 로드하는 방법을 보여주는 자습서입니다.
Snowflake 관리 Iceberg 테이블 만들기: Snowflake 관리 Iceberg 테이블을 만들기 위한 예제 코드입니다.
2단계: 액세스 제어 구성하기¶
중요
쿼리하려는 Iceberg 테이블에 대한 액세스 권한이 구성된 역할이 이미 있는 경우 이 단계를 건너뛸 수 있습니다.
이 단계에서는 외부 쿼리 엔진으로 쿼리하려는 Snowflake 관리 Iceberg 테이블에 대한 액세스 제어를 구성합니다. 예를 들어, Snowflake에서 다음 역할을 설정할 수 있습니다.
데이터베이스의 모든 스키마와 모든 Snowflake 관리 Iceberg 테이블에 대한 액세스 권한이 있는 data_engineer 역할.
데이터베이스의 한 스키마에 액세스하고 해당 스키마 내에서 두 개의 Snowflake 관리 Iceberg 테이블에만 액세스할 수 있는 data_analyst 역할.
Iceberg 테이블에 대한 액세스 구성¶
Iceberg 테이블을 쿼리하려면 작업을 수행하는 데 사용되는 역할에 외부 클라우드 저장소에 연결하는 데 사용하는 외부 볼륨에 대한 USAGE 권한이 있어야 합니다.
다음 예제에서는 이름이 ``my_ext_vol``인 외부 볼륨에 대한 USAGE 권한을 이름이 ``data_engineer``인 역할에 부여합니다.
GRANT USAGE ON EXTERNAL VOLUME my_ext_vol TO ROLE data_engineer;
외부 볼륨의 USAGE 권한에 대한 자세한 내용은 외부 볼륨 권한 섹션을 참조하세요.
참고
Iceberg 테이블을 쿼리하려면 작업을 수행하는 데 사용되는 역할에 Iceberg 테이블에 대한 SELECT 권한 및 상위 데이터베이스와 스키마에 대한 USAGE, MONITOR 권한도 있어야 합니다. 역할에 이러한 권한을 부여하는 예제는 예: 서비스 계정 사용자 설정 섹션을 참조하세요.
예: 서비스 계정 사용자 설정¶
다음 예제에서는 Iceberg 테이블에 대한 읽기 전용 액세스 권한으로 Snowflake에서 서비스 계정 사용자를 설정합니다.
data_engineer역할을 생성합니다.data_engineer역할에my_ext_vol외부 볼륨에 대한 USAGE 권한을 부여합니다.data_engineer역할에iceberg_test_db데이터베이스와 해당public스키마에 대한 USAGE 및 MONITOR 권한을 부여합니다.test_tableIceberg 테이블에 대한 SELECT 권한을 부여합니다.이름이
horizon_rest_srv_account_user``인 서비스 사용자를 생성하고 해당 사용자에게 ``data_engineer역할을 할당합니다.
CREATE OR REPLACE ROLE data_engineer;
GRANT USAGE ON EXTERNAL VOLUME my_ext_vol TO ROLE data_engineer;
GRANT USAGE,MONITOR ON DATABASE iceberg_test_db TO ROLE data_engineer;
GRANT USAGE,MONITOR ON SCHEMA iceberg_test_db.public TO ROLE data_engineer;
GRANT SELECT ON TABLE iceberg_test_db.public.test_table TO ROLE data_engineer;
CREATE OR REPLACE USER horizon_rest_srv_account_user TYPE=SERVICE DEFAULT_ROLE=data_engineer;
GRANT ROLE data_engineer TO USER horizon_rest_srv_account_user;
(선택 사항) Iceberg 테이블에 대한 향후 권한 부여 적용¶
스키마에서 생성된 모든 새 Iceberg 테이블에 대한 액세스를 보장하려면 GRANT … ON FUTURE ICEBERG TABLES 구문을 사용합니다.
다음 예제에서는 my_schema``라는 스키마 아래에 생성된 모든 Iceberg 테이블에 대한 액세스 권한을 ``data_engineer 역할에 부여합니다.
GRANT SELECT, REFERENCES ON FUTURE ICEBERG TABLES IN SCHEMA my_db.my_schema TO ROLE data_engineer;
Snowflake에서의 액세스 제어에 대한 자세한 내용은 다음 항목을 참조하세요.
3단계: 인증을 위한 액세스 토큰 얻기¶
이 단계에서는 Snowflake 계정의 Horizon Catalog 엔드포인트에 인증하는 데 필요한 액세스 토큰을 얻습니다. 각 사용자(서비스 또는 사람)에 대한 액세스 토큰과 Snowflake 관리 Iceberg 테이블에 대한 액세스 권한이 구성된 역할에 대한 액세스 토큰을 얻어야 합니다. 예를 들어, DATA_ENGINEER 역할의 사용자 및 DATA_ANALYST 역할의 다른 사용자에 대해 하나의 액세스 토큰을 얻어야 합니다.
:ref:`Horizon Catalog를 통해 외부 쿼리 엔진을 Iceberg 테이블에 연결<label-tables_iceberg_query_using_external_query_engine_snowflake_horizon_connect_external_query_engine>`하는 경우 나중에 이 액세스 토큰을 지정합니다.
다음 인증 옵션 중 하나를 사용하여 액세스 토큰을 얻을 수 있습니다.
외부 OAuth¶
외부 OAuth를 사용하는 경우, ID 공급자에 대한 액세스 토큰을 생성합니다. 지침은 External OAuth 개요 섹션을 참조하세요.
참고
또는 외부 OAuth의 경우 액세스 토큰을 지정하는 대신 자동 토큰 새로 고침을 사용하여 엔진에 대한 연결을 구성할 수 있습니다.
키 페어 인증¶
키 페어 인증을 사용하는 경우 액세스 토큰을 얻으려면 개인 키로 JSON 웹 토큰(JWT)에 서명합니다.
다음 단계에서는 키 페어 인증을 위한 액세스 토큰을 생성하는 방법을 다룹니다.
1단계: 키 페어 인증 구성¶
이 단계에서는 다음 작업을 수행합니다.
개인 키 생성하기
공개 키 생성하기
개인 키와 공개 키를 안전하게 저장하기
사용자에게 공개 키를 할당할 수 있는 권한을 부여합니다
공개 키를 Snowflake 사용자에게 할당하기
사용자의 공개 키 지문 확인하기
자세한 지침은 키 페어 인증 구성하기 섹션을 참조하십시오.
2단계: 사용자에게 역할의 권한 부여¶
GRANT ROLE 명령을 실행하여 쿼리하려는 테이블에 대한 권한이 있는 Snowflake 역할을 키 페어 인증 사용자에게 부여합니다. 예를 들어 my_service_user 사용자에게 ENGINEER 역할을 부여하려면 다음 명령을 실행합니다.
GRANT ROLE ENGINEER to user my_service_user;
3단계: JSON 웹 토큰(JWT) 생성¶
이 단계에서는 SnowSQL을 사용하여 키 페어 인증을 위한 JSON 웹 토큰(JWT)을 생성합니다.
참고
사용자의 컴퓨터에 `SnowSQL<https://www.snowflake.com/developers/downloads/snowsql/>`_이 설치되어 있어야 합니다.
또는 Python, Snowflake CLI, Java 또는 Node.js를 사용하여 JWT를 생성할 수 있습니다. 예를 들어 다음 섹션을 참조하세요.
SnowSQL을 사용하여 JWT를 생성하려면 다음을 수행합니다.
snowsql --private-key-path "<private_key_file>" \
--generate-jwt \
-h "<account_identifier>.snowflakecomputing.com" \
-a "<account_locator>" \
-u "<user_name>"
여기서
<private_key_file>is the path to your private key file that corresponds to the public key assigned to your Snowflake user. For example:/Users/jsmith/.ssh/rsa_key.p8.<account_identifier>``는 Snowflake 계정의 계정 식별자입니다(``<organization_name>-<account_name>형식). 계정 식별자를 찾으려면 지원되는 외부 엔진 및 카탈로그 섹션을 참조하세요. 계정 식별자의 예는 ``myorg-myaccount``입니다.``<account_locator>``는 Snowflake 계정의 계정 로케이터입니다.
계정 로케이터를 찾으려면 Snowsight에서 Snowflake 계정 정보 찾기 섹션을 참조하고 Account Details 대화 상자에서 *계정 로케이터*를 확인합니다.
``<user_name>``은 사용자에게 할당된 공개 키가 있는 Snowflake 사용자의 사용자 이름입니다.
4단계: 액세스 토큰 생성¶
중요
액세스 토큰을 생성하려면 먼저 :ref:`JWT를 생성<label-tables_iceberg_query_using_external_query_engine_snowflake_horizon_key_pair_generate_jwt>`해야 합니다. JWT를 사용하여 액세스 토큰을 생성하므로 먼저 JWT를 생성해야 합니다.
curl 명령을 사용하여 액세스 토큰을 생성합니다.
curl -i --fail -X POST "https://<account_identifier>.snowflakecomputing.com/polaris/api/catalog/v1/oauth/tokens" \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'grant_type=client_credentials' \
--data-urlencode 'scope=session:role:<role>' \
--data-urlencode 'client_secret=<JWT_token>'
여기서
<account_identifier>``는 Snowflake 계정의 계정 식별자입니다(``<organization_name>-<account_name>형식). 계정 식별자를 찾으려면 지원되는 외부 엔진 및 카탈로그 섹션을 참조하세요. 계정 식별자의 예는 ``myorg-myaccount``입니다.``<role>``은 ENGINEER와 같이 Iceberg 테이블에 대한 액세스 권한이 부여된 Snowflake 역할입니다.
``<JWT_token>``이전 단계에서 생성한 JWT입니다.
프로그래밍 방식 액세스 토큰(PAT)¶
PATs를 사용하는 경우, 인증을 위한 PAT를 생성합니다.
먼저 PAT를 생성하고 이를 사용하여 :ref:`외부 쿼리 엔진을 Iceberg 테이블<label-tables_iceberg_query_using_external_query_engine_snowflake_horizon_connect_external_query_engine>`에 연결합니다. 그런 다음 PAT에 대한 권한을 확인하는 데만 사용하는 액세스 토큰을 생성합니다.
1단계: PAT 생성¶
PAT를 구성하고 생성하는 방법에 대한 지침은 인증을 위해 프로그래밍 방식의 액세스 토큰 사용 섹션을 참조하세요.
다음 예제에서는 ALTER USER … ADD PROGRAMMATIC ACCESS TOKEN (PAT) 명령을 사용하여 이전 단계에서 생성한 서비스 계정 사용자에 대한 프로그래밍 방식 액세스 토큰(PAT)을 생성합니다.
ALTER USER IF EXISTS HORIZON_REST_SRV_ACCOUNT_USER
ADD PAT HORIZON_REST_SRV_ACCOUNT_USER_PAT
DAYS_TO_EXPIRY = 7
ROLE_RESTRICTION = 'DATA_ENGINEER'
COMMENT = 'HORIZON REST API PAT FOR SERVICE ACCOUNT';
2단계: PAT에 대한 액세스 토큰 생성¶
이 단계에서는 PAT에 대한 액세스 토큰을 생성합니다.
주의
이 단계에서 생성하는 액세스 토큰은 PAT에 대한 :ref:`권한을 확인<label-tables_iceberg_query_using_external_query_engine_snowflake_horizon_verify_access_token_permissions>`한 경우에만 지정합니다. :ref:`외부 쿼리 엔진을 Iceberg 테이블에 연결<label-tables_iceberg_query_using_external_query_engine_snowflake_horizon_connect_external_query_engine>`한 경우 이전 단계에서 생성한 액세스 토큰이 아닌, 이전 단계에서 생성한 PAT를 지정해야 합니다.
curl 명령을 사용하여 PAT에 대한 액세스 토큰을 생성합니다.
curl -i --fail -X POST "https://<account_identifier>.snowflakecomputing.com/polaris/api/catalog/v1/oauth/tokens" \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'grant_type=client_credentials' \
--data-urlencode 'scope=session:role:<role>' \
--data-urlencode 'client_secret=<PAT_token>'
여기서
<account_identifier>``는 Snowflake 계정의 계정 식별자입니다(``<organization_name>-<account_name>형식). 계정 식별자를 찾으려면 지원되는 외부 엔진 및 카탈로그 섹션을 참조하세요. 계정 식별자의 예는 ``myorg-myaccount``입니다.``<role>``은 ENGINEER와 같이 PAT에 대한 권한이 부여되고 쿼리하려는 Iceberg 테이블에 액세스할 수 있는 Snowflake 역할입니다.
``<PAT_token>``은 이전 단계에서 생성한 PAT 토큰에 대한 값입니다.
4단계: 엑세스 토큰 권한 확인¶
이 단계에서는 이전 단계에서 얻은 액세스 토큰에 대한 권한을 확인합니다.
Horizon IRC 엔드포인트에 대한 액세스 확인¶
curl 명령을 사용하여 Horizon IRC 엔드포인트에 액세스할 수 있는 권한이 있는지 확인합니다.
curl -i --fail -X GET "https://<account_identifier>.snowflakecomputing.com/polaris/api/catalog/v1/config?warehouse=<database_name>" \
-H "Authorization: Bearer <access_token>" \
-H "Content-Type: application/json"
여기서
<account_identifier>``는 Snowflake 계정의 계정 식별자입니다(``<organization_name>-<account_name>형식). 계정 식별자를 찾으려면 지원되는 외부 엔진 및 카탈로그 섹션을 참조하세요. 계정 식별자의 예는 ``myorg-myaccount``입니다.``<access_token>``은 사용자가 생성한 액세스 토큰입니다. PAT를 사용하는 경우 이 값은 사용자가 생성한 *개인 액세스 토큰(PAT)*이 아닌, :ref:`사용자가 생성한 액세스 토큰 <label-tables_iceberg_query_using_external_query_engine_snowflake_horizon_pat_generate_access_token>`입니다.
``<database_name>``는 쿼리하려는 데이터베이스의 이름입니다.
중요
데이터베이스 이름을 소문자로 생성한 경우에도 *모두 대문자*로 지정해야 합니다.
반환 값 예제:
{
"defaults": {
"default-base-location": ""
},
"overrides": {
"prefix": "MY-DATABASE"
}
}
테이블의 메타데이터 검색¶
테이블의 메타데이터를 검색하기 위해 GET 요청을 수행할 수도 있습니다. Snowflake는 `loadTable<https://github.com/apache/iceberg/blob/apache-iceberg-1.6.1/open-api/rest-catalog-open-api.yaml#L616>`_ 작업을 통해 REST 카탈로그에서 테이블 메타데이터를 로드합니다.
curl -i --fail -X GET "https://<account_identifier>.snowflakecomputing.com/polaris/api/catalog/v1/<database_name>/namespaces/<namespace_name>/tables/<table_name>" \
-H "Authorization: Bearer <access_token>" \
-H "Content-Type: application/json"
여기서
<account_identifier>``는 Snowflake 계정의 계정 식별자입니다(``<organization_name>-<account_name>형식). 계정 식별자를 찾으려면 지원되는 외부 엔진 및 카탈로그 섹션을 참조하세요. 계정 식별자의 예는 ``myorg-myaccount``입니다.``<database_name>``은 메타데이터를 검색할 테이블의 데이터베이스입니다.
``<namespace_name>``은 메타데이터를 검색할 테이블의 네임스페이스입니다.
``<table_name>``은 메타데이터를 검색할 테이블입니다.
``<access_token>``은 사용자가 생성한 액세스 토큰입니다. PAT를 사용하는 경우 이 값은 사용자가 생성한 *개인 액세스 토큰(PAT)*이 아닌, :ref:`사용자가 생성한 액세스 토큰 <label-tables_iceberg_query_using_external_query_engine_snowflake_horizon_pat_generate_access_token>`입니다.
중요
오브젝트가 소문자로 생성되었더라도 데이터베이스, 네임스페이스, 테이블 이름을 *모두 대문자*로 지정해야 합니다.
(선택 사항) 5단계: 데이터 보호 정책 구성¶
이 단계에서는 Iceberg 테이블에 대한 데이터 보호 정책을 구성합니다. Snowflake 데이터 정책으로 보호해야 하는 테이블이 없는 경우 다음 단계로 진행할 수 있습니다.
참고
데이터 보호 정책으로 보호되는 테이블은 Horizon Iceberg REST API 및 Apache Spark™를 통해 액세스할 수 있습니다.
데이터 보호 정책을 구성하는 방법에 대한 지침은 :ref:`Horizon Iceberg REST API 및 Apache Spark™를 통해 액세스되는 Iceberg 테이블에 대한 데이터 보호 정책 구성<label-enforce_access_policies_configure_policies>`을 참조하세요.
6단계: Horizon Catalog를 통해 외부 쿼리 엔진을 Iceberg 테이블에 연결하기¶
이 단계에서는 Horizon Catalog를 통해 외부 쿼리 엔진을 Iceberg 테이블에 연결합니다. 이 연결을 통해 외부 쿼리 엔진을 사용하여 테이블을 쿼리할 수 있습니다.
외부 엔진은 Snowflake에 의해 노출된 Apache Iceberg™ REST 엔드포인트를 사용합니다. Snowflake 계정의 경우 이 엔드포인트의 형식은 다음과 같습니다.
https://<account_identifier>.snowflakecomputing.com/polaris/api/catalog
이 단계의 예제 코드는 Spark에서 연결을 설정하는 방법을 보여주며, 예제 코드는 PySpark에 있습니다. 자세한 내용은 다음 섹션을 참조하세요.
외부 OAuth 또는 키 페어 인증을 사용하여 연결하기¶
다음 구성 중 하나를 사용하여 연결합니다.
Snowflake 데이터 보호 정책이 구성되어 있지 않은 Iceberg 테이블에 액세스하려면, :ref:`데이터 정책을 적용하지 않고 외부 쿼리 엔진에 연결<label-tables_iceberg_query_using_external_query_engine_snowflake_horizon_connect_external_oauth_key_pair_no_access_policies>`합니다.
Snowflake 행 액세스 및 마스킹 정책이 구성된 Iceberg 테이블에 액세스하려면 :ref:`데이터 정책이 적용된 외부 쿼리 엔진에 연결<label-tables_iceberg_query_using_external_query_engine_snowflake_horizon_connect_external_oauth_key_pair_access_policies>`합니다.
데이터 정책을 적용하지 않고 외부 쿼리 엔진 연결¶
외부 OAuth 또는 키 페어 인증을 사용하여 외부 쿼리 엔진을 Iceberg 테이블에 연결하려면 다음 예제 코드를 사용합니다.
이 코드는 데이터 보호 정책을 적용하지 않습니다.
# Snowflake Horizon Catalog Configuration, change as per your environment
CATALOG_URI = "https://<account_identifier>.snowflakecomputing.com/polaris/api/catalog"
HORIZON_SESSION_ROLE = f"session:role:<role>"
CATALOG_NAME = "<database_name>" #provide in UPPER CASE
# Cloud Service Provider Region Configuration (where the Iceberg data is stored)
REGION = "eastus2"
# Paste the External Oauth Access token that you generated in Snowflake here
ACCESS_TOKEN = "<your_access_token>"
# Iceberg Version
ICEBERG_VERSION = "1.9.1"
def create_spark_session():
"""Create and configure Spark session for Snowflake Iceberg access."""
spark = (
SparkSession.builder
.appName("SnowflakeIcebergReader")
.master("local[*]")
# JAR Dependencies for Iceberg and Azure
.config(
"spark.jars.packages",
f"org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:{ICEBERG_VERSION},"
f"org.apache.iceberg:iceberg-aws-bundle:{ICEBERG_VERSION}"
# for Azure storage, use the below package and comment above azure bundle
# f"org.apache.iceberg:iceberg-azure-bundle:{ICEBERG_VERSION}"
)
# Iceberg SQL Extensions
.config("spark.sql.extensions", "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions")
.config("spark.sql.defaultCatalog", CATALOG_NAME)
# Horizon REST Catalog Configuration
.config(f"spark.sql.catalog.{CATALOG_NAME}", "org.apache.iceberg.spark.SparkCatalog")
.config(f"spark.sql.catalog.{CATALOG_NAME}.type", "rest")
.config(f"spark.sql.catalog.{CATALOG_NAME}.uri", CATALOG_URI)
.config(f"spark.sql.catalog.{CATALOG_NAME}.warehouse", CATALOG_NAME)
.config(f"spark.sql.catalog.{CATALOG_NAME}.token", ACCESS_TOKEN)
.config(f"spark.sql.catalog.{CATALOG_NAME}.scope", HORIZON_SESSION_ROLE)
.config(f"spark.sql.catalog.{CATALOG_NAME}.client.region", REGION)
# Required for vended credentials
.config(f"spark.sql.catalog.{CATALOG_NAME}.header.X-Iceberg-Access-Delegation", "vended-credentials")
.config("spark.sql.iceberg.vectorization.enabled", "false")
.getOrCreate()
)
spark.sparkContext.setLogLevel("ERROR")
return spark
여기서
<account_identifier>`는 쿼리하려는 Iceberg 테이블이 포함된 Snowflake 계정의 Snowflake 계정 식별자입니다. 이 식별자를 찾으려면 :ref:`label-tables_iceberg_query_using_external_query_engine_snowflake_horizon_before_you_begin섹션을 참조하세요.<your_access_token>`은 획득한 액세스 토큰입니다. 이 토큰을 얻으려면 :ref:`label-tables_iceberg_query_using_external_query_engine_snowflake_horizon_generate_access_token섹션을 참조하세요.참고
또는 외부 OAuth의 경우 액세스 토큰을 지정하는 대신 자동 토큰 새로 고침을 사용하여 엔진에 대한 연결을 구성할 수 있습니다.
:code:`<database_name>`은 쿼리하려는 Snowflake 관리 Iceberg 테이블이 포함된 Snowflake 계정의 데이터베이스 이름입니다.
참고
Spark의
.warehouse속성에는 Snowflake 웨어하우스 이름이 아닌 Snowflake 데이터베이스 이름이 필요합니다.:code:`<role>`은 쿼리하려는 Iceberg 테이블에 대한 액세스 권한으로 구성된 Snowflake의 역할입니다. 예를 들어 DATA_ENGINEER 과 같습니다.
중요
기본적으로 코드 예제는 Amazon S3에 저장된 Apache Iceberg™ 테이블에 대해 설정됩니다. Iceberg 테이블이 Azure Storage(ADLS)에 저장되는 경우 다음 단계를 수행합니다.
다음 줄을 주석으로 처리합니다.
f"org.apache.iceberg:iceberg-aws-bundle:{ICEBERG_VERSION}"다음 줄의 주석 처리를 제거합니다.
# f"org.apache.iceberg:iceberg-azure-bundle:{ICEBERG_VERSION}"
데이터 정책이 적용된 외부 쿼리 엔진 연결¶
적용된 데이터 보호 정책에 따라 연결하려면 Spark를 Iceberg 테이블에 연결하기 섹션을 참조하세요.
프로그래밍 방식 액세스 토큰(PAT)을 사용하여 연결하기¶
다음 구성 중 하나를 사용하여 연결합니다.
쿼리하려는 Iceberg 테이블에 데이터 보호 정책을 사용하지 않는 경우 데이터 정책을 적용하지 않고 외부 쿼리 엔진 연결 구성 을 사용합니다.
쿼리하려는 Iceberg 테이블에 데이터 보호 정책을 *사용*하는 경우 데이터 정책이 적용된 외부 쿼리 엔진 연결 구성을 사용합니다.
데이터 정책을 적용하지 않고 외부 쿼리 엔진 연결¶
프로그래밍 방식 액세스 토큰(PAT)을 통해 외부 쿼리 엔진을 Iceberg 테이블에 연결하려면 다음 예제 코드를 사용합니다.
이 코드는 데이터 보호 정책을 적용하지 않습니다.
# Snowflake Horizon Catalog Configuration, change as per your environment
CATALOG_URI = "https://<account_identifier>.snowflakecomputing.com/polaris/api/catalog"
HORIZON_SESSION_ROLE = f"session:role:<role>"
CATALOG_NAME = "<database_name>" #provide in UPPER CASE
# Cloud Service Provider Region Configuration (where the Iceberg data is stored)
REGION = "eastus2"
# Paste the PAT you generated in Snowflake here
PAT_TOKEN = "<your_PAT_token>"
# Iceberg Version
ICEBERG_VERSION = "1.9.1"
def create_spark_session():
"""Create and configure Spark session for Snowflake Iceberg access."""
spark = (
SparkSession.builder
.appName("SnowflakeIcebergReader")
.master("local[*]")
# JAR Dependencies for Iceberg and Azure
.config(
"spark.jars.packages",
f"org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:{ICEBERG_VERSION},"
f"org.apache.iceberg:iceberg-aws-bundle:{ICEBERG_VERSION}"
# for Azure storage, use the below package and comment above azure bundle
# f"org.apache.iceberg:iceberg-azure-bundle:{ICEBERG_VERSION}"
)
# Iceberg SQL Extensions
.config("spark.sql.extensions", "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions")
.config("spark.sql.defaultCatalog", CATALOG_NAME)
# Horizon REST Catalog Configuration
.config(f"spark.sql.catalog.{CATALOG_NAME}", "org.apache.iceberg.spark.SparkCatalog")
.config(f"spark.sql.catalog.{CATALOG_NAME}.type", "rest")
.config(f"spark.sql.catalog.{CATALOG_NAME}.uri", CATALOG_URI)
.config(f"spark.sql.catalog.{CATALOG_NAME}.warehouse", CATALOG_NAME)
.config(f"spark.sql.catalog.{CATALOG_NAME}.credential", PAT_TOKEN)
.config(f"spark.sql.catalog.{CATALOG_NAME}.scope", HORIZON_SESSION_ROLE)
.config(f"spark.sql.catalog.{CATALOG_NAME}.client.region", REGION)
# Required for vended credentials
.config(f"spark.sql.catalog.{CATALOG_NAME}.header.X-Iceberg-Access-Delegation", "vended-credentials")
.config("spark.sql.iceberg.vectorization.enabled", "false")
.getOrCreate()
)
spark.sparkContext.setLogLevel("ERROR")
return spark
여기서
<account_identifier>`는 쿼리하려는 Iceberg 테이블이 포함된 Snowflake 계정의 Snowflake 계정 식별자입니다. 이 식별자를 찾으려면 :ref:`label-tables_iceberg_query_using_external_query_engine_snowflake_horizon_before_you_begin섹션을 참조하세요.<your_PAT_token>`은 사용자가 얻은 PAT입니다. 이 토큰을 얻으려면 :ref:`label-tables_iceberg_query_using_external_query_engine_snowflake_horizon_generate_access_token섹션을 참조하세요.:code:`<role>`은 쿼리하려는 Iceberg 테이블에 대한 액세스 권한으로 구성된 Snowflake의 역할입니다. 예를 들어 DATA_ENGINEER 과 같습니다.
:code:`<database_name>`은 쿼리하려는 Snowflake 관리 Iceberg 테이블이 포함된 Snowflake 계정의 데이터베이스 이름입니다.
참고
Spark의
.warehouse속성에는 Snowflake 웨어하우스 이름이 아닌 Snowflake 데이터베이스 이름이 필요합니다.
중요
기본적으로 코드 예제는 Amazon S3에 저장된 Apache Iceberg™ 테이블에 대해 설정됩니다. Iceberg 테이블이 Azure Storage(ADLS)에 저장되는 경우 다음 단계를 수행합니다.
다음 줄을 주석으로 처리합니다.
f"org.apache.iceberg:iceberg-aws-bundle:{ICEBERG_VERSION}"다음 줄의 주석 처리를 제거합니다.
# f"org.apache.iceberg:iceberg-azure-bundle:{ICEBERG_VERSION}"
데이터 정책이 적용된 외부 쿼리 엔진 연결¶
적용된 데이터 보호 정책에 따라 연결하려면 Spark를 Iceberg 테이블에 연결하기 섹션을 참조하세요.
7단계: Iceberg 테이블 쿼리하기¶
이 단계에서는 Apache Spark™를 사용하여 Iceberg 테이블을 쿼리하는 다음 코드 예제를 제공합니다.
네임스페이스 표시하기
네임스페이스 사용하기
테이블 표시하기
테이블 쿼리하기
네임스페이스 표시하기¶
spark.sql("show namespaces").show()
네임스페이스 사용하기¶
spark.sql("use namespace <your_schema_name_in_snowflake>")
테이블 표시하기¶
spark.sql("show tables").show()
테이블 쿼리하기¶
spark.sql("use namespace spark_demo")
spark.sql("select * from <your_table_name_in_snowflake>").show()
외부 쿼리 엔진으로 Iceberg 테이블을 쿼리할 때의 고려 사항¶
외부 쿼리 엔진으로 Iceberg 테이블을 쿼리할 때 다음 사항을 고려합니다.
Iceberg
Snowflake 테이블의 경우:
Snowflake 관리 Iceberg 테이블만 지원됩니다.
다음 테이블 쿼리는 지원되지 않습니다.
원격 테이블
Snowflake 네이티브 테이블
COPY INTO 테이블 명령을 사용하여 Iceberg 호환 Parquet 데이터 파일의 데이터와 함께 로드한 Delta 기반 Iceberg 테이블 및 Snowflake 관리 Iceberg 테이블 등 외부 관리 Iceberg 테이블
쿼리할 수는 있지만 Iceberg 테이블에 쓸 수는 없습니다.
외부 읽기는 Iceberg 버전 2 이하에서만 지원됩니다.
액세스 제어:
다음과 같은 세분화된 데이터 정책으로 보호되는 테이블은 Snowflake Horizon Catalog를 사용하여 Apache Spark™를 통해 액세스할 수 있습니다.
마스킹 정책
태그 기반 마스킹 정책
행 액세스 정책
자세한 내용은 Apache Spark™에서 Apache Iceberg™ 테이블 쿼리 시 데이터 보호 정책 적용 섹션을 참조하십시오.
네트워크 및 비공개 연결
사용자 수준에서 설정된 네트워크 정책은 이 기능에서 지원되지 않습니다.
:ref:`label-snowflake_managed_network_rules`의 경우, 정적인 송신 IP 주소는 지원되지 않습니다.
저장소 계정에 대한 Horizon Catalog 엔드포인트 액세스 권한을 명시적으로 부여하는 기능은 지원되지 않습니다. 외부 엔진에서 Horizon Catalog로, Horizon Catalog에서 저장소 계정으로의 보안 연결을 위해 비공개 연결을 사용하는 것이 좋습니다.
목록:
:doc:`목록에 대한 자동 복제 </collaboration/provider-listings-auto-fulfillment>`를 통해 공유하는 Iceberg 테이블은 컨슈머 계정의 Horizon Iceberg REST Catalog API를 사용하여 액세스할 수 없습니다.
클라우드:
이 기능은 모든 상업 클라우드 리전의 Amazon S3, Google Cloud 또는 Microsoft Azure에 저장된 Snowflake 관리 Iceberg 테이블에만 지원됩니다. S3 호환 비 AWS 저장소는 아직 지원되지 않습니다.
Amazon S3에 저장된 Iceberg 테이블의 경우:
SSE-KMS 암호화를 사용하려는 경우 고객 지원 팀 또는 계정 팀에 문의하여 액세스 활성화에 대한 지원을 받으세요.
Azure에 저장된 Iceberg 테이블의 경우:
Azure 가상 네트워크(VNet)는 지원되지 않습니다.
인증:
키 페어 인증의 경우 키 페어 순환은 지원되지 않습니다.
워크로드 ID 페더레이션은 이 기능에서 지원되지 않습니다.