了解 U-SQL 和 Spark 数据格式之间的差异
重要
Azure Data Lake Analytics于 2024 年 2 月 29 日停用。 通过此公告了解更多信息。
对于数据分析,组织可以使用 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 数据工厂管道以将数据从 Azure Data Lake Storage Gen1 帐户复制到 Azure Data Lake Storage Gen2 帐户。
- 编写 Spark 作业,该作业从 Azure Data Lake Storage Gen1 帐户读取数据并将其写入 Azure Data Lake Storage Gen2 帐户。 根据你的用例,如果不需要保留原始文件格式,则可能需要以不同的格式(例如 Parquet)编写它。
我们建议你阅读将大数据分析解决方案从 Azure Data Lake Storage Gen1 升级到 Azure Data Lake Storage Gen2 一文
移动 U-SQL 表中存储的数据
Spark 无法理解 U-SQL 表。 如果已将数据存储在 U-SQL 表中,则将运行 U-SQL 作业,该作业可提取表数据并将其保存为 Spark 可识别的格式。 最合适的格式是在 Hive 元存储的文件夹布局之后创建一组 Parquet 文件。
可以在具有内置 Parquet 输出器的 U-SQL 中,使用包含文件集的动态输出分区创建分区文件夹来实现输出。 处理比以往更多的文件并使用 Parquet 提供了有关如何创建此类 Spark 可用数据的示例。
完成此转换后,按移动 Azure Data Lake Storage Gen1 文件存储中的数据一章中所述复制数据。
注意事项
数据语义,复制文件时,将在字节级别进行复制。 因此,Azure Data Lake Storage Gen2 帐户中应显示相同的数据。 但请注意,Spark 可能会以不同的方式解释某些字符。 例如,对于 CSV 文件中的行分隔符,可以使用不同的默认值。 此外,如果要(从表中)复制类型化数据,则 Parquet 和 Spark 的某些类型化值(如 float)可能有不同的精度和小数位数,并且可能以不同的方式处理 null 值。 例如,U-SQL 的 null 值具有 C# 语义,而 Spark 的 null 值具有三值逻辑。
数据组织(分区)U-SQL 表提供两级分区。 外部级别 (
PARTITIONED BY
) 是按值分区,并且主要映射到使用文件夹层次结构的 Hive/Spark 分区方案中。 需要确保 null 值映射到正确的文件夹。 U-SQL 中的内部级别 (DISTRIBUTED BY
) 提供四种分布方案:轮循机制、范围、哈希和直接哈希。 Hive/Spark 表仅支持使用与 U-SQL 不同的哈希函数的值分区或哈希分区。 输出 U-SQL 表数据时,可能只能映射到 Spark 的值分区中,并且可能需要根据最终 Spark 查询进一步优化数据布局。