U-SQL と Spark のデータ形式の違いを理解する
重要
Azure Data Lake Analyticsは、2024 年 2 月 29 日に廃止されました。 詳細については、このお知らせを参照してください。
データ分析の場合、organizationは Azure Synapse Analytics または Microsoft Fabric を使用できます。
Azure Databricks または Azure HDInsight Spark を使用する場合は、Azure Data Lake Storage Gen1 から Azure Data Lake Storage Gen2 にデータを移行することをお勧めします。
ファイルを移動するだけでなく、U-SQL テーブルに格納されているデータを Spark からアクセスできるようにすることも可能です。
Azure Data Lake Storage Gen1 ファイルに格納されているデータを移動する
ファイルに格納されているデータは、さまざまな方法で移動できます。
- Azure Data Lake Storage Gen1 アカウントから Azure Data Lake Storage Gen2 アカウントにデータをコピーする Azure Data Factory パイプラインを作成します。
- Azure Data Lake Storage Gen1 アカウントからデータを読み取り Azure Data Lake Storage Gen2 アカウントに書き込む Spark ジョブを作成します。 元のファイル形式を保持する必要がない場合は、ユース ケースに基づいて Parquet などの別の形式で記述できます。
「ビッグ データ分析ソリューションを Azure Data Lake Storage Gen1 から Azure Data Lake Storage Gen2 にアップグレードする」の記事を確認することをお勧めします。
U-SQL テーブルに格納されているデータを移動する
U-SQL テーブルは Spark では認識されません。 データが U-SQL テーブルに格納されている場合は、テーブル データを抽出して Spark が認識できる形式で保存する U-SQL ジョブを実行します。 最も適切な形式は、Hive metastore のフォルダー レイアウトに従って、一連の Parquet ファイルを作成することです。
U-SQL では、組み込みの Parquet アウトプッターを使用し、ファイル セットを使用した動的出力パーティション分割を使用してパーティション フォルダーを作成することで、出力を実現できます。 これまで以上に多くのファイルの処理し、Parquet を使用することで、このような Spark で使用可能なデータを作成する方法の例を示します。
この変換の後、「Azure Data Lake Storage Gen1 ファイルに格納されているデータを移動する」の章で説明されているようにデータをコピーします。
注意事項
データのセマンティクス。ファイルをコピーする場合、コピーはバイト レベルで行われます。 そのため、同じデータが Azure Data Lake Storage Gen2 アカウントに表示されるはずです。 ただし、Spark では一部の文字が異なる方法で解釈される場合があります。 たとえば、CSV ファイルの行の区切り記号に異なる既定値を使用する場合があります。 さらに、(テーブルから) 型指定されたデータをコピーする場合、Parquet と Spark では、一部の型指定された値 (float など) の有効桁数と小数点以下桁数が異なる場合があり、null 値が異なる方法で扱われる場合があります。 たとえば、U-SQL には null 値の C# セマンティクスがあり、Spark には null 値に対する 3 値論理があります。
データ編成 (パーティション分割)。U-SQL テーブルには 2 つのレベルのパーティション分割が用意されています。 外部レベル (
PARTITIONED BY
) は値で表され、ほとんどの場合、フォルダー階層を使用して Hive/Spark パーティション構成にマップされます。 null 値が適切なフォルダーにマップされていることを確認する必要があります。 U-SQL の内部レベル (DISTRIBUTED BY
) には、ラウンド ロビン、範囲、ハッシュ、直接ハッシュの 4 つの分散スキームが用意されています。 Hive/Spark テーブルでは、U-SQL とは異なるハッシュ関数を使用して、値のパーティション分割またはハッシュ パーティション分割のみをサポートしています。 U-SQL テーブル データを出力する場合、Spark の値のパーティション分割にのみマップできる可能性があり、最終的な Spark クエリによっては、データ レイアウトをさらに調整する必要がある場合があります。