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 が使用されます。

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

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

特定の列を取得する

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

Note

結果の範囲を設定できる列の最大数は 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')"

次の手順