2017-01-08 35 views
1

我使用一個自定義IOutputter到我的U型SQL腳本的結果寫入到AA本地數據庫:Azure的數據分析湖得到IOutputter輸出文件名

OUTPUT @dataset 
TO "/path/somefilename_{*}.file" 
USING new CustomOutputter() 

public class CustomOutputter: IOutputter 
{   
     public CustomOutputter() 
     { 
      myCustomDatabase.Open("databasefile.database"); 
     }  

     public override void Output(IRow input, IUnstructuredWriter output) 
     { 

     } 
} 

是否有可能取代「databasefile。數據庫「與指定的輸出文件路徑」/path/somefilename_{*}.file「?

由於我無法將output.BaseStream傳遞到數據庫,我找不到正確寫入正確文件名的方法。

UPDATE我如何在本地數據庫文件複製到ADLA提供的OutputStream:

 public override void Close() 
     { 
      using (var fs = File.Open("databasefile.database", FileMode.Open)) 
      { 
       byte[] buffer = new byte[65536]; 
       int read; 
       while ((read = fs.Read(buffer, 0, buffer.Length)) > 0) 
       { 
        this.output.BaseStream.Write(buffer, 0, read); 
        this.output.BaseStream.Flush(); 
       } 
      } 
     } 

回答

1

我不知道你試圖達到的目標。

  1. 在ADLA中執行時(本地執行沒有此限制),輸出器(和一般UDO)不能離開它們的容器(VMs)。因此,連接到容器外的數據庫將被阻止,我不確定將數據寫入臨時VM /容器中的數據庫有什麼幫助。

  2. UDO模型有一個定義良好的模型,用於通過將input行(集)中的數據寫入output的流中來寫入生活在ADLS或WASB中的文件。您可以寫入本地文件,但同樣,這些文件將在頂點完成執行後停止存在。

鑑於此信息,請您重新解釋一下嗎?基於澄清評論

更新你有兩個選擇,以從一個行集數據庫:

  1. 您使用ADF做數據移動。這是最常用的方法,可能是最簡單的方法。
  2. 如果您使用自定義輸出器,你可以嘗試以下方法:
    1. 輸出寫入行集成是本地的你的頂點數據庫(你必須部署數據庫作爲一種資源,所以你可能需要一個小使用數據庫接口
    2. 然後將數據庫文件從頂點本地目錄讀取到輸出流中,以便將文件複製到ADLS中。
    3. 請注意,您需要對輸出器進行原子文件處理,以避免編寫多個數據庫文件,然後將它們拼接在一起。
+0

感謝您的解釋。 我的意圖是讓ADLA創建一個數據庫文件,然後這個數據庫文件可以被其他服務使用而不需要進一步處理。因此,由於ADLA的這些限制,我似乎不得不使用例如DF和自定義活動將ADLA輸出轉換爲我的數據庫文件格式,對嗎? – coalmee

+1

其實你有兩種選擇: 1.你用ADF來做數據移動。 2.如果您使用自定義輸出器,您可以嘗試以下操作: 將輸出行集寫入您的頂點本地的數據庫中(您可能必須將數據庫部署爲資源,因此可能需要佔用較小的版本適合資源大小限制),然後將數據庫文件從頂點本地目錄讀入輸出流,以便將文件複製到ADLS中。請注意,您需要原子文件處理並將數據庫作爲資源部署到頂點。 –

+0

我寧願採用第二種方法。我已經嘗試將DB文件複製到輸出流。但是,在將文件寫入輸出流時,它的行大小限制爲4MB。請參閱:http://stackoverflow.com/questions/41533328/azure-data-lake-analytics-ioutputter-e-runtime-user-rowtoobig – coalmee

相關問題