2017-04-09 33 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