2016-12-28 60 views
2

我想爲多個文件編寫相同的查詢。這是可能以U-SQL編寫動態查詢,或者有沒有什麼辦法,以消除同一段代碼像可以在U-Sql中寫入動態查詢

Select count(*) as cnt from @table1; 
Select count(*) as cnt from @table2; 

重寫可更換

Select count(*) as cnt from @dynamic 

where @dynamic = table1, table2

回答

1

(Azure Data Lake團隊)

您的問題提到從文件讀取,但您的示例顯示錶。如果你真的想從文件中讀取數據,EXTRACT語句支持「文件集」,允許一個單一的EXTRACT語句讀取由圖案指定

@data = 
    EXTRACT name string, 
      age int, 
      FROM "/input/{*}.csv" 
    USING Extractors.Csv(); 

有時多個文件,數據需要包括文件名中的數據來弗羅姆,這樣你就可以像這樣指定它:

@data = 
    EXTRACT name string, 
      age int, 
      basefilename string 
      FROM "/input/{basefilename}.csv" 
    USING Extractors.Csv(); 
+0

謝謝... Basfilename對我來說是新的..編輯我的文章。我在帖子中給出的例子只是一個小例子。我必須爲不同的文件編寫多個查詢,這些查詢返回相同類型的輸出,並且在大多數情況下文件結構不同。 – Ajay

+1

順便說一句,「basefilename」不是保留關鍵字 - 它可以是任何有效的標識符。關鍵是它爲輸入文件名或路徑的某個部分應用了一個列值(有時稱爲「虛擬列」)。 – saveenr

+0

Ohk .....我們可以寫所有這些查詢在SP或TVF,我可以傳遞表名稱,列名作爲參數?這可能嗎? – Ajay

1

我使用匹配列使用第一行中的CSV文件中值自定義CSV提取。

這裏是添加在後面的代碼或自定義程序集的要點是:https://gist.github.com/serri588/ff9e3047d8341398df4aea7557f0a82c

我做到了,因爲我有一個結構類似的文件,但略有不同的列清單。標準的CSV提取器不適合執行此任務。用你想提取的所有可能的列名寫出你的EXTRACT,它將填充這些值並忽略其餘的值。

例如:

TABLE_1具有列A,B,和C. TABLE_2具有列A,C,和D.

我想要A,B和C,所以我的提取物將是

EXTRACT 
    A string, 
    B string, 
    C string 
FROM "Table_{*}.csv" 
USING new yourNamespace.CSVExtractor(); 

表1將填充所有三列,而表2將填充A和C,忽略D.

1

U形SQL不提供動態執行模式本身,而是它增加了一些功能,可以幫助一些動態場景。

今天,您必須爲TVF/SP的表類型參數提供確切的模式,但是,我們正在研究一個功能,它將爲您提供靈活的模式參數,從而可以編寫一個TVF/SP應用於任何表格形狀(只要您的查詢不依賴於形狀)。

直到這種能力變得可用,建議是:

  1. 如果你知道什麼是可能的模式是:爲每一個可能的模式的TVF/SP,並相應地調用它。

  2. 使用任何SDK(C#,PowerShell,Java,Python,node.js)根據架構信息對腳本進行代碼生成(假設您將它應用於可從中獲取架構信息的對象而不僅僅是一個行集表達式)。