다음을 통해 공유


Transact-SQL을 사용하여 웨어하우스에 데이터 수집

적용 대상:✅ Microsoft Fabric 내 웨어하우스

Transact-SQL 언어는 Lakehouse 및 웨어하우스의 기존 테이블에서 웨어하우스의 새 테이블로 대규모로 데이터를 로드하는 데 사용할 수 있는 옵션을 제공합니다. 이러한 옵션은 집계된 데이터가 있는 테이블의 새 버전, 행의 하위 집합이 있는 테이블 버전을 만들거나 복잡한 쿼리의 결과로 테이블을 만들어야 하는 경우에 편리합니다. 몇 가지 예를 살펴보겠습니다.

쿼리 결과를 사용하여 새 테이블 만들기

Microsoft Fabric의 Warehouse를 사용하면 다음 T-SQL 문을 사용하여 T-SQL 쿼리의 결과에 따라 새 테이블을 쉽게 만들 수 있습니다.

  • CREATE TABLE AS SELECT 문 출력 결과를 사용하여 웨어하우스에 새 테이블을 생성할 수 있는 CTAS 문입니다 SELECT.
  • SELECT INTO 쿼리 절을 사용하면 테이블 원본에서 결과를 선택하고 결과를 새 테이블로 리디렉션할 수 있습니다. T-SQL 언어의 표준 기능입니다.

이러한 두 문은 유사하므로 다음 예제는 CTAS 문에 중점을 줍니다.

CTAS 문은 새 테이블에 대한 수집 작업을 병렬로 실행하여 작업 영역에서 데이터 변환 및 새 테이블을 만드는 데 매우 효율적입니다.

CTAS 문의 SELECT 부분에 대해 다음 옵션을 사용할 수 있습니다.

  • 웨어하우스 테이블(예: 준비 테이블) 읽는 방법
  • Lakehouse용 SQL 분석 엔드포인트에서 자동 생성된 테이블을 사용하여 Lakehouse Delta Lake 폴더를 읽습니다.
  • 함수를 사용하여 Azure Data Lake 또는 Azure Blob Storage에서 직접 CSV, Parquet 또는 JSONL 파일을 읽습니다 OPENROWSET .

Note

이 문서의 예제에서는 Bing COVID-19 샘플 데이터 세트를 사용합니다. 샘플 데이터 세트를 로드하려면 COPY 문을 사용하여 데이터 웨어하우스에 데이터를 수집하는 단계를 따라 웨어하우스에 샘플 데이터를 생성하세요.

Warehouse 테이블에서 테이블 만들기

첫 번째 예제에서는 기존 dbo.bing_covid19_data_2023 테이블의 복사본이지만 2023년의 데이터로만 필터링되는 새 테이블을 만드는 방법을 보여 줍니다.

CREATE TABLE dbo.bing_covid19_data_2023
AS
SELECT * 
FROM dbo.bing_covid19_data 
WHERE DATEPART(YEAR, updated) = '2023';

원본 테이블의 year 열에서 가져온 값을 사용하여 새 month, dayofmonth, updated 열을 통해 새 테이블을 만들 수도 있습니다. 이는 연도별로 감염 데이터를 시각화하거나 가장 많은 COVID-19 사례가 관찰되는 월을 확인하려는 경우에 유용할 수 있습니다.

CREATE TABLE dbo.bing_covid19_data_with_year_month_day
AS
SELECT DATEPART(YEAR, updated) AS [year],
       DATEPART(MONTH, updated) AS [month],
       DATEPART(DAY, updated) AS [dayofmonth],
       * 
FROM dbo.bing_covid19_data;

또 다른 예로, 연도에 관계없이 매월 관찰되는 사례 수를 요약하여 계절성이 지정된 국가/지역에서 확산되는 영향을 평가하는 새 테이블을 만들 수 있습니다. 이전 예제에서 만든 테이블과 새 month 열을 원본으로 사용합니다.

CREATE TABLE dbo.infections_by_month
AS
SELECT country_region, [month],
       SUM(CAST(confirmed as bigint)) AS confirmed_sum
FROM dbo.bing_covid19_data_with_year_month_day
GROUP BY country_region, [month];

이 새 테이블에 따르면 미국은 매년 January에 확진 사례가 더 많았으며, 그 다음으로는 December, October 순이었던 것을 볼 수 있습니다. April은 전체 사례 수가 가장 낮은 월입니다.

SELECT * FROM dbo.infections_by_month
WHERE country_region = 'United States'
ORDER BY confirmed_sum DESC;

Delta Lake 폴더에서 테이블 만들기

OneLake에 유지되는 Delta Lake 폴더는 레이크하우스의 /Tables 폴더에 저장된 경우 자동으로 테이블로 표시됩니다. 다음 코드는 bing_covid19_data_2023 레이크하우스의 Delta Lake 폴더 /Tables/bing_covid19_delta_lake 새 테이블을 만듭니다.

CREATE TABLE dbo.bing_covid19_data_2023
AS
SELECT * 
FROM MyLakehouse.dbo.bing_covid19_delta_lake 
WHERE DATEPART(YEAR, updated) = '2023';

파일이 저장되는 레이크하우스를 참조하는 세 부분으로 구성된 이름 표기법을 사용하여 Delta Lake 폴더를 참조할 수 있습니다. 이전 섹션에 표시된 모든 예제는 Delta Lake 폴더에 적용할 수 있습니다.

CSV/Parquet/JSONL 파일에서 테이블 만들기

Warehouse bing_covid19_data 테이블에서 데이터를 읽는 대신 함수를 사용하여 OPENROWSET 외부 파일에서 직접 새 테이블을 만들 수도 있습니다.

CREATE TABLE dbo.bing_covid19_data_2022
AS
SELECT *
FROM OPENROWSET(BULK 'https://pandemicdatalake.blob.core.windows.net/public/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.parquet') AS data;
WHERE DATEPART(YEAR, updated) = '2022'

외부 CSV 파일에서 데이터를 변환하여 새 테이블을 만들 수도 있습니다.

CREATE TABLE dbo.bing_covid19_data_with_year_month_day
AS
SELECT DATEPART(YEAR, updated) AS [year], 
       DATEPART(MONTH, updated) AS [month],
       DATEPART(DAY, updated) AS [dayofmonth],
       *
FROM OPENROWSET(BULK 'https://pandemicdatalake.blob.core.windows.net/public/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv') AS data;

또 다른 예로, 연도에 관계없이 매월 관찰되는 사례 수를 요약하여 계절성이 지정된 국가/지역에서 확산되는 영향을 평가하는 새 테이블을 만들 수 있습니다. 이전 예제에서 만든 테이블과 새 month 열을 원본으로 사용합니다.

CREATE TABLE dbo.infections_by_month_2022
AS
SELECT country_region,
       DATEPART(MONTH, updated) AS [month],
       SUM(CAST(confirmed as bigint)) AS [confirmed_sum]
FROM OPENROWSET(BULK 'https://pandemicdatalake.blob.core.windows.net/public/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.jsonl') AS data
WHERE DATEPART(YEAR, updated) = '2022'
GROUP BY country_region, DATEPART(MONTH, updated);

이 새 테이블에 따르면 미국은 매년 January에 확진 사례가 더 많았으며, 그 다음으로는 December, October 순이었던 것을 볼 수 있습니다. April은 전체 사례 수가 가장 낮은 월입니다.

SELECT * FROM dbo.infections_by_month_2022
WHERE country_region = 'United States'
ORDER BY confirmed_sum DESC;

미국 월별 감염 수가 내림차순으로 정렬된 쿼리 결과의 스크린샷, 월 숫자 1이 맨 위에 표시됩니다.

자세한 예제 및 구문 참조는 CREATE TABLE AS SELECT(Transact-SQL)를 참조하세요.

T-SQL 쿼리를 사용하여 기존 테이블에 데이터 수집

이전 예제에서는 쿼리 결과에 따라 새 테이블을 만듭니다. 기존 테이블에서 예제를 복제하기 위해 INSERT ... SELECT 패턴을 사용할 수 있습니다.

Warehouse 테이블에서 데이터 수집

다음 코드는 웨어하우스 테이블에서 기존 테이블로 새 데이터를 수집합니다.

INSERT INTO dbo.bing_covid19_data_2023
SELECT *
FROM dbo.bing_covid19_data
WHERE DATEPART(YEAR, updated) = '2023';

결과 쿼리 열 형식이 대상 테이블의 열과 일치하는 한, SELECT 문에 대한 쿼리 조건은 유효한 쿼리일 수 있습니다. 열 이름을 지정하고 대상 테이블의 열 하위 집합만 포함하는 경우 다른 모든 열은 NULL로 로드됩니다. 자세한 내용은 INSERT INTO...SELECT를 사용하여 최소 로깅 및 병렬 처리로 데이터를 대량으로 가져오기를 참조하세요.

Delta Lake 폴더에서 데이터 수집

OneLake에 유지되는 Delta Lake 폴더는 레이크하우스의 폴더에 /Tables 저장되는 경우 자동으로 테이블로 표시됩니다.

다음 코드는 Lakehouse의 /Tables/bing_covid19_delta_lake 섹션에 있는 Delta Lake 폴더에서 새로운 데이터를 수집합니다.

INSERT INTO dbo.bing_covid19_data_2023
SELECT *
FROM MyLakehouse.dbo.bing_covid19_delta_lake 
WHERE DATEPART(YEAR, updated) = '2023';

CSV/Parquet/JSONL 파일에서 데이터 수집

Parquet, CSV 또는 JSON 파일을 스토리지에서 수집하기 위해 OPENROWSET 함수를 원본으로 사용할 수 있습니다.

INSERT INTO dbo.bing_covid19_data_2023
SELECT *
FROM OPENROWSET(BULK 'https://pandemicdatalake.blob.core.windows.net/public/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.parquet') AS data
WHERE DATEPART(YEAR, updated) = '2023';

와 같은 와일드카드를 사용하거나 와 같은 *.parquet/year=*/month=*분할된 디렉터리를 대상으로 하여 여러 파일을 읽을 수 있습니다. 성능을 최적화하려면 WHERE 절에 필터를 적용하여 쿼리 실행 중에 불필요한 행 및 파티션을 제거합니다.

이러한 예제는 COPY INTO를 사용하여 수집에 사용되는 예제와 유사합니다. COPY INTO 명령은 특히 간단한 원본-대상 데이터 로드에 더 쉽게 사용할 수 있습니다. 수집 중에 변환을 유연하게 수행해야 하는 경우 (예: 값 변환 또는 다른 테이블과의 조인), 원본 데이터를 변환할 때 INSERT ... SELECT를 사용하는 것이 좋습니다.

OneLake에서 데이터 수집

Fabric OneLake 스토리지에서 데이터를 수집하기 위해 OPENROWSET 함수를 원본으로 사용할 수 있습니다. {workspaceId}{lakehouseId}를 다음 샘플에서 해당 작업 영역 및 레이크하우스 GUID로 바꾸십시오.

INSERT INTO dbo.bing_covid19_data_2023
SELECT *
FROM OPENROWSET(BULK 'https://onelake.dfs.fabric.microsoft.com/{workspaceId}/{lakehouseId}/Files/year=*/month=*/*.parquet') AS data
WHERE data.filepath(1) = '2023'

이 예제는 Azure Data Lake Storage에서 데이터를 읽는 이전 예제를 기반으로 합니다. 값 변환, 다른 테이블과의 조인 또는 특정 파티션 읽기와 같이 원본 데이터를 변환해야 하는 경우 이 방법을 사용합니다. 이러한 경우를 사용하면 INSERT ... SELECT 데이터 수집 중에 변환을 유연하게 적용할 수 있습니다.

다른 웨어하우스 및 레이크하우스의 테이블에서 데이터 수집

CREATE TABLE AS SELECTINSERT ... SELECT에 대해, SELECT 문은 교차 웨어하우스 쿼리를 사용하여 대상 테이블이 저장되는 웨어하우스와 다른 웨어하우스의 테이블을 참조할 수도 있습니다. 이 작업은 세 부분으로 구성된 명명 규칙 [warehouse_or_lakehouse_name.][schema_name.]table_name을 사용하여 수행할 수 있습니다. 예를 들어 다음과 같은 작업 영역 자산이 있다고 가정하겠습니다.

  • 최신 사례 데이터가 포함된 이름이 cases_lakehouse인 레이크하우스입니다.
  • 참조 데이터에 사용되는 테이블이 있는 reference_warehouse라는 웨어하우스입니다.
  • 대상 테이블이 만들어지는 research_warehouse라는 웨어하우스입니다.

세 부분으로 구성된 명명을 사용하여 이러한 작업 영역 자산에 있는 테이블의 데이터를 결합하는 새 테이블을 만들 수 있습니다.

CREATE TABLE research_warehouse.dbo.cases_by_continent
AS
SELECT *
FROM cases_lakehouse.dbo.bing_covid19_data AS cases
INNER JOIN reference_warehouse.dbo.bing_covid19_data AS reference
ON cases.iso3 = reference.countrycode;

웨어하우스 간 쿼리에 대한 자세한 내용은 데이터베이스 간 SQL 쿼리 작성을 참조하세요.