폴더 및 여러 파일 쿼리
이 문서에서는 Azure Synapse Analytics에서 서버리스 SQL 풀을 사용하여 쿼리를 작성하는 방법을 알아봅니다.
서버리스 SQL 풀은 Windows에서 사용되는 와일드카드와 유사한 와일드카드를 사용하여 여러 파일 또는 폴더 읽기를 지원합니다. 여러 와일드카드를 사용할 수 있으므로 유연성이 더 뛰어납니다.
필수 조건
첫 번째 단계는 쿼리를 실행할 수 있는 데이터베이스 를 만드는 것입니다. 그런 다음 해당 데이터베이스에서 설치 스크립트를 실행하여 개체를 초기화합니다. 이 설치 스크립트는 이러한 샘플에서 사용되는 데이터 원본, 데이터베이스 범위 자격 증명 및 외부 파일 형식을 만듭니다.
csv/taxi 폴더를 사용하여 샘플 쿼리를 따릅니다. 여기에는 2016년 7월부터 2018년 6월까지의 NYC Taxi - 노란색 택시 여행 레코드 데이터가 포함되어 있습니다. csv/taxi의 파일 이름은 다음 패턴을 사용하여 연도 및 월의 이름을 지정합니다.
yellow_tripdata_<year>-<month>.csv*
폴더의 모든 파일 읽기
다음 예제에서는 csv/taxi 폴더에서 모든 NYC Yellow Taxi 데이터 파일을 읽은 다음 연간 총 승객 및 승차 수를 반환합니다. 또한 집계 함수의 사용을 보여 줍니다.
SELECT
YEAR(pickup_datetime) as [year],
SUM(passenger_count) AS passengers_total,
COUNT(*) AS [rides_total]
FROM OPENROWSET(
BULK 'csv/taxi/*.csv',
DATA_SOURCE = 'sqlondemanddemo',
FORMAT = 'CSV', PARSER_VERSION = '2.0',
FIRSTROW = 2
)
WITH (
pickup_datetime DATETIME2 2,
passenger_count INT 4
) AS nyc
GROUP BY
YEAR(pickup_datetime)
ORDER BY
YEAR(pickup_datetime);
참고 항목
단일 OPENROWSET
파일로 액세스하는 모든 파일의 구조는 동일해야 합니다(열 수 및 해당 데이터 형식).
폴더에 있는 파일의 하위 집합 읽기
다음 예제에서는 와일드카드를 사용하여 csv/taxi 폴더에서 2017 NYC Yellow Taxi 데이터 파일을 읽고 결제 유형당 총 요금 금액을 반환합니다.
SELECT
payment_type,
SUM(fare_amount) AS fare_total
FROM OPENROWSET(
BULK 'csv/taxi/yellow_tripdata_2017-*.csv',
DATA_SOURCE = 'sqlondemanddemo',
FORMAT = 'CSV', PARSER_VERSION = '2.0',
FIRSTROW = 2
)
WITH (
payment_type INT 10,
fare_amount FLOAT 11
) AS nyc
GROUP BY payment_type
ORDER BY payment_type;
참고 항목
단일 OPENROWSET
파일로 액세스하는 모든 파일의 구조는 동일해야 합니다(열 수 및 해당 데이터 형식).
여러 파일 경로를 사용하여 폴더에 있는 파일의 하위 집합 읽기
다음 예제에서는 두 개의 파일 경로를 사용하여 csv/taxi 폴더에서 2017 NYC Yellow Taxi 데이터 파일을 읽습니다. 첫 번째는 1월의 데이터가 포함된 파일의 전체 경로를 사용하고, 두 번째 경로는 와일드카드를 사용하여 10월, 11월 및 12월을 읽습니다. 각 경로에 대해 지불 유형당 총 요금 금액이 반환됩니다.
SELECT
payment_type,
SUM(fare_amount) AS fare_total
FROM OPENROWSET(
BULK (
'csv/taxi/yellow_tripdata_2017-01.csv',
'csv/taxi/yellow_tripdata_2017-1*.csv'
),
DATA_SOURCE = 'sqlondemanddemo',
FORMAT = 'CSV', PARSER_VERSION = '2.0',
FIRSTROW = 2
)
WITH (
payment_type INT 10,
fare_amount FLOAT 11
) AS nyc
GROUP BY payment_type
ORDER BY payment_type;
참고 항목
단일 OPENROWSET
파일로 액세스하는 모든 파일의 구조는 동일해야 합니다(열 수 및 해당 데이터 형식).
폴더 읽기
사용자가 제공하는 OPENROWSET
경로는 폴더의 경로일 수도 있습니다. 다음 섹션에는 해당 쿼리 형식이 포함되어 있습니다.
특정 폴더의 모든 파일 읽기
폴더의 모든 파일 읽기에 표시된 것처럼 파일 수준 와일드카드를 사용하여 폴더의 모든 파일을 읽을 수 있습니다. 그러나 폴더를 쿼리하고 해당 폴더 내의 모든 파일을 이용하는 방법이 있습니다.
제공된 OPENROWSET
경로가 폴더를 가리키는 경우 해당 폴더의 모든 파일이 쿼리의 원본으로 사용됩니다. 다음 쿼리는 csv/taxi 폴더의 모든 파일을 읽습니다.
참고 항목
쿼리에서 /
경로의 끝에 존재합니다. 폴더를 나타냅니다.
/
생략하면 쿼리는 taxi라는 파일을 대신 대상으로 합니다.
SELECT
YEAR(pickup_datetime) as [year],
SUM(passenger_count) AS passengers_total,
COUNT(*) AS [rides_total]
FROM OPENROWSET(
BULK 'csv/taxi/',
DATA_SOURCE = 'sqlondemanddemo',
FORMAT = 'CSV', PARSER_VERSION = '2.0',
FIRSTROW = 2
)
WITH (
vendor_id VARCHAR(100) COLLATE Latin1_General_BIN2,
pickup_datetime DATETIME2,
dropoff_datetime DATETIME2,
passenger_count INT,
trip_distance FLOAT,
rate_code INT,
store_and_fwd_flag VARCHAR(100) COLLATE Latin1_General_BIN2,
pickup_location_id INT,
dropoff_location_id INT,
payment_type INT,
fare_amount FLOAT,
extra FLOAT,
mta_tax FLOAT,
tip_amount FLOAT,
tolls_amount FLOAT,
improvement_surcharge FLOAT,
total_amount FLOAT
) AS nyc
GROUP BY
YEAR(pickup_datetime)
ORDER BY
YEAR(pickup_datetime);
참고 항목
단일 OPENROWSET
파일로 액세스하는 모든 파일의 구조는 동일해야 합니다(열 수 및 해당 데이터 형식).
여러 폴더의 모든 파일 읽기
와일드카드를 사용하여 여러 폴더의 파일을 읽을 수 있습니다. 다음 쿼리는 이름이 t로 시작하고 i로 끝나는 csv 폴더에 있는 모든 폴더의 모든 파일을 읽습니다.
참고 항목
쿼리에서 /
경로의 끝에 존재합니다. 폴더를 나타냅니다.
/
생략하면 쿼리는 t*i라는 파일을 대신 대상으로 합니다.
SELECT
YEAR(pickup_datetime) as [year],
SUM(passenger_count) AS passengers_total,
COUNT(*) AS [rides_total]
FROM OPENROWSET(
BULK 'csv/t*i/',
DATA_SOURCE = 'sqlondemanddemo',
FORMAT = 'CSV', PARSER_VERSION = '2.0',
FIRSTROW = 2
)
WITH (
vendor_id VARCHAR(100) COLLATE Latin1_General_BIN2,
pickup_datetime DATETIME2,
dropoff_datetime DATETIME2,
passenger_count INT,
trip_distance FLOAT,
rate_code INT,
store_and_fwd_flag VARCHAR(100) COLLATE Latin1_General_BIN2,
pickup_location_id INT,
dropoff_location_id INT,
payment_type INT,
fare_amount FLOAT,
extra FLOAT,
mta_tax FLOAT,
tip_amount FLOAT,
tolls_amount FLOAT,
improvement_surcharge FLOAT,
total_amount FLOAT
) AS nyc
GROUP BY
YEAR(pickup_datetime)
ORDER BY
YEAR(pickup_datetime);
참고 항목
단일 OPENROWSET
파일로 액세스하는 모든 파일의 구조는 동일해야 합니다(열 수 및 해당 데이터 형식).
조건과 일치하는 폴더가 하나만 있으므로 쿼리 결과는 폴더의 모든 파일 읽기와 동일합니다.
재귀적으로 폴더 트래버스
경로의 끝에서 지정 /**
하면 서버리스 SQL 풀이 폴더를 재귀적으로 트래버스할 수 있습니다. 다음 쿼리는 csv/taxi 폴더에 있는 모든 폴더 및 하위 폴더의 모든 파일을 읽습니다.
SELECT
YEAR(pickup_datetime) as [year],
SUM(passenger_count) AS passengers_total,
COUNT(*) AS [rides_total]
FROM OPENROWSET(
BULK 'csv/taxi/**',
DATA_SOURCE = 'sqlondemanddemo',
FORMAT = 'CSV', PARSER_VERSION = '2.0',
FIRSTROW = 2
)
WITH (
vendor_id VARCHAR(100) COLLATE Latin1_General_BIN2,
pickup_datetime DATETIME2,
dropoff_datetime DATETIME2,
passenger_count INT,
trip_distance FLOAT,
rate_code INT,
store_and_fwd_flag VARCHAR(100) COLLATE Latin1_General_BIN2,
pickup_location_id INT,
dropoff_location_id INT,
payment_type INT,
fare_amount FLOAT,
extra FLOAT,
mta_tax FLOAT,
tip_amount FLOAT,
tolls_amount FLOAT,
improvement_surcharge FLOAT,
total_amount FLOAT
) AS nyc
GROUP BY
YEAR(pickup_datetime)
ORDER BY
YEAR(pickup_datetime);
참고 항목
단일 OPENROWSET
파일로 액세스하는 모든 파일의 구조는 동일해야 합니다(열 수 및 해당 데이터 형식).
여러 와일드카드 사용
여러 경로 수준에서 다양한 와일드카드를 사용할 수 있습니다. 예를 들어 이름이 t로 시작하고 i로 끝나는 모든 폴더에서 2017 데이터만 있는 파일을 읽도록 이전 쿼리를 보강할 수 있습니다.
참고 항목
쿼리에서 /
경로의 끝에 존재합니다. 폴더를 나타냅니다.
/
생략하면 쿼리는 t*i라는 파일을 대신 대상으로 합니다.
쿼리당 최대 10개의 와일드카드 제한이 있습니다.
SELECT
YEAR(pickup_datetime) as [year],
SUM(passenger_count) AS passengers_total,
COUNT(*) AS [rides_total]
FROM OPENROWSET(
BULK 'csv/t*i/yellow_tripdata_2017-*.csv',
DATA_SOURCE = 'sqlondemanddemo',
FORMAT = 'CSV', PARSER_VERSION = '2.0',
FIRSTROW = 2
)
WITH (
vendor_id VARCHAR(100) COLLATE Latin1_General_BIN2,
pickup_datetime DATETIME2,
dropoff_datetime DATETIME2,
passenger_count INT,
trip_distance FLOAT,
rate_code INT,
store_and_fwd_flag VARCHAR(100) COLLATE Latin1_General_BIN2,
pickup_location_id INT,
dropoff_location_id INT,
payment_type INT,
fare_amount FLOAT,
extra FLOAT,
mta_tax FLOAT,
tip_amount FLOAT,
tolls_amount FLOAT,
improvement_surcharge FLOAT,
total_amount FLOAT
) AS nyc
GROUP BY
YEAR(pickup_datetime)
ORDER BY
YEAR(pickup_datetime);
참고 항목
단일 OPENROWSET
파일로 액세스하는 모든 파일의 구조는 동일해야 합니다(열 수 및 해당 데이터 형식).
조건과 일치하는 폴더가 하나만 있기 때문에 쿼리 결과는 폴더의 파일 하위 집합 읽기 및 특정 폴더에서 모든 파일 읽기와 동일합니다. 더 복잡한 와일드카드 사용 시나리오는 Parquet 파일 쿼리를 참조 하세요.