【问题标题】:U-SQL Inner Join creates a huge big write fileU-SQL Inner Join 创建一个巨大的大写文件
【发布时间】:2017-10-19 07:53:04
【问题描述】:

全部 -

我在使用 ADLA 连接表并将它们加载到 Azure SQL DW 时遇到了一些问题。

我被困在一个加载过程中,不知道如何解决这个问题。我有一些购买信息,当我从本地系统拉入 ADLS 时,会创建大约 25 MB 的输出文件,当我尝试将它们加入到在 ADLA 作业中使用“INNER JOIN”时,它会持续运行很长时间。在运行时,我看到输出文件继续超过 5+ GB。我觉得这对于 25 MB 的文件来说太多了,并且不确定是否做错了什么(从 VS 运行时附上屏幕截图以供参考)。

我所做的过程是 - 1- 使用 ADF 将数据从本地数据库加载到云 ADLS 存储 2- 运行 ADLA 作业以将 ADLS 文件拉入 ADLA 表并使用 ROUND ROBIN 选项进行分区以避免数据倾斜问题 3- ADLA作业将在 ADLS 存储 4-ADF 管道中创建一个聚合文件以将 #3 文件加载到 Azure SQL DW

任何指示或帮助都会很有帮助。

谢谢,沙比尔

这是代码(我已删除所有字段名称和客户信息)。希望这会有所帮助。

DECLARE @dir = "/{date:yyyy}/{date:MM}/{date:dd}/<FILE PATH>/";
DECLARE @in_1 string = <FILE #1>;
DECLARE @in_2 string = <FILE #2>;
DECLARE @out string = <OUTPUT FILE>;

@file1 =
    EXTRACT 
        <25 COL. WITH ALL NULLABLE>
        date DateTime
    FROM @in_1
    USING Extractors.Text(delimiter : '|');

@file2 =
    EXTRACT 
        <40 COL. WITH ALL NULLABLE>
        date DateTime
    FROM @in_2
    USING Extractors.Text(delimiter : '|');

@output =
    SELECT 
        <25 + 40 COL. FROM INPUT FILES>
    FROM @file1 AS f1
        INNER JOIN @file2 AS f2
        ON f1.join1 == f2.join2;

OUTPUT @purchase
TO @out
USING Outputters.Text(delimiter : '|');

这是运行抛出 ADF 管道并使用日期和文件路径的外部参数。

enter image description here

【问题讨论】:

  • 请贴出你正在使用的U-SQL代码。
  • Bob,我在问题中添加了代码 sn-p。提前致谢。
  • 如果您的连接导致数据量增加,可能的原因是您的连接列中有重复值。如果一个值在左表中出现 100 次,在右表中出现 1000 次,这将导致输出中出现 100,000 行(笛卡尔积)。您能否检查一下,例如通过在 Power BI 中加载您的数据?
  • 是的。亚历山大。这看起来更像是笛卡尔问题。我现在很好。谢谢!

标签: u-sql


【解决方案1】:

看起来您没有使用 ADLA 表,而只是直接在 U-SQL 中处理文件。这很好,但我只是想检查一下,因为你提到了表格。此外,代码正在输出脚本中不存在的@purchase - 我假设您实际上是在真实脚本中输出正确的行集。

几个问题:

  • 您是否检查过 ADLS 中输入文件的格式/内容?您是否完成了@file1 和@file2 的输出以检查它们是否创建了您所期望的?
  • 您如何知道输出文件正在增长到 5 GB?从工作图?你能附上那个吗?
  • 您是否在使用“日期”列?
  • 您的联接列是单列吗?它是什么类型的?

【讨论】:

  • 是的。我暂时不使用 ADLA 表。虽然也尝试过并得到相同的结果。我确实通过运行提取作业检查了输出,它们显示了所有预期的内容是的,它显示在作业图中。加入 int 数据类型的列及其两个表之间的一个主要关系我在问题中附上了作业图的屏幕截图。请检查。
【解决方案2】:

如果f1.join1 == f2.join2 实际上是在比较一个(或多或少)唯一键与另一个(或多或少)唯一键,那么您应该得到合理数量的行。

但许多人使用相同的语法实现CROSS JOINs。例如,f1.join1 可以在整个表 f1 中为 1,f2.join2 也可以在整个表 f2 中为 1。这些数据值会导致您的输出成为两个表的CROSS JOIN

【讨论】:

    猜你喜欢
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-20
    • 2017-08-31
    • 1970-01-01
    • 2018-06-01
    • 1970-01-01
    相关资源
    最近更新 更多