2017-04-09 60 views
1

全部 -U-SQL Inner Join创建了一个巨大的写入文件

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

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

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

任何指针或帮助都可能非常有用。

感谢,Shabbir

下面是代码(我已删除了所有的字段名和客户信息)。希望这可以帮助。

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

+0

请发布您正在使用的U-SQL代码。 – wBob

+0

鲍勃,我在我的问题中添加了代码片段。提前致谢。 –

+0

如果您的连接正在增加数据量,可能的原因是您的连接列中有重复的值。如果一个数值在左边的表格中出现100次,在右边的表格中出现1000次,这将导致输出(笛卡尔乘积)中的100,000行。你能否检查一下,例如通过在Power BI中加载你的数据? –

回答

0

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

几个问题:

  • 你检查在ADLS输入文件的格式/内容?你是否完成了@ file1和@ file2的输出来检查他们是否创建了你期望的?
  • 您如何知道输出文件正在增长到5 GB?从作业图表?你能附上吗?
  • 您是否在使用“日期”列来表示某些内容?
  • 您的连接列是单列吗?它是什么类型?
+0

是的。我现在不使用ADLA表格。虽然也尝试过,得到了同样的结果。 我通过运行提取作业检查了输出并显示了所有预期内容 是的,它显示在作业图中。 在int数据类型中加入列及其两个表之间的主要关系 我已经在问题中附加了作业图的屏幕截图。请检查。 –

0

如果f1.join1 == f2.join2其实就是一个比较(更多或更少)唯一的​​密钥与另一个(更多或更少)唯一的​​密钥,那么你应该得到行的合理数量。

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