Bagikan melalui


Membuat kueri folder dan beberapa file

Dalam artikel ini, Anda akan mempelajari cara membuat kueri menggunakan kumpulan SQL tanpa server di Azure Synapse Analytics.

Kumpulan SQL tanpa server mendukung pembacaan beberapa file/ folder dengan menggunakan wildcard, mirip dengan wildcard yang digunakan di Windows OS. Namun, dengan fleksibilitas yang lebih besar karena beberapa wildcard diizinkan.

Prasyarat

Langkah pertama Anda adalah membuat database tempat Anda akan menjalankan kueri. Kemudian menginisialisasi objek dengan mengeksekusi skrip pengaturan pada database itu. Skrip pengaturan ini akan membuat sumber data, info masuk tercakup database, dan format file eksternal yang digunakan dalam sampel ini.

Anda akan menggunakan folder csv/taxi untuk mengikuti contoh kueri. Kueri ini berisi data NYC Taxi - Rekaman Perjalanan Yellow Taxi dari Juli 2016 hingga Juni 2018. File dalam csv/taxi diberi nama menurut tahun dan bulan menggunakan pola berikut: yellow_tripdata_<year>-<month>.csv

Membaca semua file dalam folder

Contoh di bawah ini membaca semua file data NYC Yellow Taxi dari folder csv/taxi dan mengembalikan jumlah total penumpang dan perjalanan per tahun. Ini juga menunjukkan penggunaan fungsi agregat.

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);

Catatan

Semua file yang diakses dengan OPENROWSET tunggal harus memiliki struktur yang sama (yaitu, jumlah kolom dan tipe datanya).

Membaca subset file dalam folder

Contoh di bawah ini membaca file data 2017 NYC Yellow Taxi dari folder csv/taxi menggunakan wildcard dan mengembalikan jumlah total tarif per jenis pembayaran.

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;

Catatan

Semua file yang diakses dengan OPENROWSET tunggal harus memiliki struktur yang sama (yaitu, jumlah kolom dan tipe datanya).

Baca subset file dalam folder menggunakan beberapa jalur file

Contoh di bawah ini membaca file data NYC Yellow Taxi 2017 dari folder csv/taksi menggunakan 2 jalur file pertama dengan jalur penuh ke file yang berisi data dari bulan Januari dan kedua dengan bulan pembacaan kartubebas November dan Desember yang mengembalikan jumlah tarif total per jenis pembayaran.

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;

Catatan

Semua file yang diakses dengan OPENROWSET tunggal harus memiliki struktur yang sama (yaitu, jumlah kolom dan tipe datanya).

Membaca folder

Jalur yang Anda sediakan ke OPENROWSET juga bisa menjadi jalur ke folder. Bagian berikut menyertakan tipe kueri ini.

Membaca semua file dari folder tertentu

Anda dapat membaca semua file dalam folder menggunakan wildcard tingkat file seperti yang diperlihatkan di Membaca semua file dalam folder. Tapi, ada cara untuk membuat kueri folder dan mengonsumsi semua file dalam folder tersebut.

Jika jalur yang diberikan di titik OPENROWSET menunjuk ke folder, semua file di folder tersebut akan digunakan sebagai sumber untuk kueri Anda. Kueri berikut akan membaca semua file dalam folder csv/taxi.

Catatan

Perhatikan keberadaan / di akhir jalur dalam kueri di bawah ini. Tanda tersebut menunjukkan folder. Jika / dihilangkan, kueri akan menargetkan file bernama 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);

Catatan

Semua file yang diakses dengan OPENROWSET tunggal harus memiliki struktur yang sama (yaitu, jumlah kolom dan tipe datanya).

Membaca semua file dari beberapa folder

Dimungkinkan untuk membaca file dari beberapa folder dengan menggunakan wildcard. Kueri berikut akan membaca semua file dari semua folder yang berada dalam folder csv yang memiliki nama yang dimulai dengan t dan diakhiri dengan i.

Catatan

Perhatikan keberadaan / di akhir jalur dalam kueri di bawah ini. Ini menunjukkan folder. Jika / dihilangkan, kueri akan menargetkan file bernama t*i sebagai gantinya.

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);

Catatan

Semua file yang diakses dengan OPENROWSET tunggal harus memiliki struktur yang sama (yaitu, jumlah kolom dan tipe datanya).

Karena Anda hanya memiliki satu folder yang cocok dengan kriteria, hasil kueri sama dengan Membaca semua file dalam folder.

Menelusuri folder secara rekursif

Kumpulan SQL tanpa server dapat secara rekursif menelusuri folder jika Anda menentukan /** di akhir jalur. Kueri berikut akan membaca semua file dari semua folder dan subfolder yang berada dalam folder 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);

Catatan

Semua file yang diakses dengan OPENROWSET tunggal harus memiliki struktur yang sama (yaitu, jumlah kolom dan tipe datanya).

Beberapa wildcard

Anda dapat menggunakan beberapa wildcard di tingkat jalur yang berbeda. Misalnya, Anda dapat memperkaya kueri sebelumnya untuk membaca file dengan data 2017 saja, dari semua folder yang namanya dimulai dengan t dan diakhiri dengan i.

Catatan

Perhatikan keberadaan / di akhir jalur dalam kueri di bawah ini. Ini menunjukkan folder. Jika / dihilangkan, kueri akan menargetkan file bernama t*i sebagai gantinya. Ada batas maksimum 10 kartubebas per kueri.

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);

Catatan

Semua file yang diakses dengan OPENROWSET tunggal harus memiliki struktur yang sama (yaitu, jumlah kolom dan tipe datanya).

Karena Anda hanya memiliki satu folder yang cocok dengan kriteria, hasil kueri sama dengan Membaca subset file dalam folder dan Membaca semua file dari folder tertentu. Skenario penggunaan wildcard yang lebih kompleks dibahas dalam Membuat kueri file Parquet.

Langkah berikutnya

Informasi selengkapnya bisa dibaca di artikel Membuat kueri file tertentu.