次の方法で共有


Azure Data Lake Storage クエリ アクセラレーションを使用してデータをフィルター処理する

この記事では、クエリ アクセラレーションを使用して、ストレージ アカウントからデータのサブセットを取得する方法について説明します。

クエリ アクセラレーションを使用すると、アプリケーションと分析フレームワークは、特定の操作を実行するために必要なデータのみを取得することで、データ処理を大幅に最適化できます。 詳細については、 Azure Data Lake Storage のクエリ 高速化に関するページを参照してください。

前提条件

  • Azure Storage にアクセスするには、Azure サブスクリプションが必要です。 まだサブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。

  • 汎用 v2 ストレージ アカウント。 ストレージ アカウントの作成を参照してください。

  • 二重暗号化はサポートされていません。

  • JSON ファイルに対してクエリを実行する場合、このファイル内の各レコード サイズは 1 MB 未満にする必要があります。

  • タブを選択すると、SDK 固有の前提条件が表示されます。

    適用なし


環境を設定する

手順 1: パッケージをインストールする

Az モジュール バージョン 4.6.0 以降をインストールします。

Install-Module -Name Az -Repository PSGallery -Force

以前のバージョンの Az から更新するには、次のコマンドを実行します。

Update-Module -Name Az

手順 2: ステートメントを追加する

適用なし

フィルターを使用してデータを取得する

SQL を使用して、クエリ 高速化要求で行フィルター述語と列プロジェクションを指定できます。 次のコードは、ストレージ内の CSV ファイルに対してクエリを実行し、3 番目の列が Hemingway, Ernest値と一致するすべてのデータ行を返します。

  • SQL クエリでは、クエリ対象のファイルを示すためにキーワード BlobStorage が使用されます。

  • 最初の列が_1である列参照は_Nとして指定されます。 ソース ファイルにヘッダー行が含まれている場合は、ヘッダー行で指定された名前で列を参照できます。

Function Get-QueryCsv($ctx, $container, $blob, $query, $hasheaders) {
    $tempfile = New-TemporaryFile
    $informat = New-AzStorageBlobQueryConfig -AsCsv -HasHeader:$hasheaders
    Get-AzStorageBlobQueryResult -Context $ctx -Container $container -Blob $blob -InputTextConfiguration $informat -OutputTextConfiguration (New-AzStorageBlobQueryConfig -AsCsv -HasHeader) -ResultFile $tempfile.FullName -QueryString $query -Force
    Get-Content $tempfile.FullName
}

$container = "data"
$blob = "csv/csv-general/seattle-library.csv"
Get-QueryCsv $ctx $container $blob "SELECT * FROM BlobStorage WHERE _3 = 'Hemingway, Ernest, 1899-1961'" $false

特定の列を取得する

結果の範囲を列のサブセットに設定できます。 こうすることで、特定の計算を実行するために必要な列のみを取得できます。 これにより、ネットワーク経由で転送されるデータが少なくなるため、アプリケーションのパフォーマンスが向上し、コストが削減されます。

結果の範囲を指定できる列の最大数は 49 です。 結果に 49 を超える列を含める必要がある場合は、SELECT 式にワイルドカード文字 (*) を使用します (例: SELECT *)。

このコードは、データ セット内のすべての書籍の BibNum 列のみを取得します。 また、ソース ファイルのヘッダー行の情報を使用して、クエリ内の列を参照します。

Function Get-QueryCsv($ctx, $container, $blob, $query, $hasheaders) {
    $tempfile = New-TemporaryFile
    $informat = New-AzStorageBlobQueryConfig -AsCsv -HasHeader:$hasheaders
    Get-AzStorageBlobQueryResult -Context $ctx -Container $container -Blob $blob -InputTextConfiguration $informat -OutputTextConfiguration (New-AzStorageBlobQueryConfig -AsCsv -HasHeader) -ResultFile $tempfile.FullName -QueryString $query -Force
    Get-Content $tempfile.FullName
}

$container = "data"
$blob = "csv/csv-general/seattle-library-with-headers.csv"
Get-QueryCsv $ctx $container $blob "SELECT BibNum FROM BlobStorage" $true

次のコードでは、行のフィルター処理と列プロジェクションを同じクエリに結合します。

Get-QueryCsv $ctx $container $blob $query $true

Function Get-QueryCsv($ctx, $container, $blob, $query, $hasheaders) {
    $tempfile = New-TemporaryFile
    $informat = New-AzStorageBlobQueryConfig -AsCsv -HasHeader:$hasheaders
    Get-AzStorageBlobQueryResult -Context $ctx -Container $container -Blob $blob -InputTextConfiguration $informat -OutputTextConfiguration (New-AzStorageBlobQueryConfig -AsCsv -HasHeader) -ResultFile $tempfile.FullName -QueryString $query -Force
    Get-Content $tempfile.FullName
}

$container = "data"
$query = "SELECT BibNum, Title, Author, ISBN, Publisher, ItemType
            FROM BlobStorage
            WHERE ItemType IN
                ('acdvd', 'cadvd', 'cadvdnf', 'calndvd', 'ccdvd', 'ccdvdnf', 'jcdvd', 'nadvd', 'nadvdnf', 'nalndvd', 'ncdvd', 'ncdvdnf')"

次のステップ