2017-08-15 172 views
1

我是ADL的新手& JSON文件。我正在嘗試將JSON文件加載到ADL表中。如何將JSON文件上傳到Azure Data Lake表

我的JSON文件結構

{ABCD:{Time:"", Date:"", ProcessingTime:"", ProcessName:""}}, 
{ABCD:{Date:"", ProcessingTime:"", ProcessName:""}}, 
{ABCD:{ProcessingTime:"", ProcessName:""}}, 
{ABCD:{Time:"", Date:"", ProcessingTime:"", ProcessName:""}}, 

我的表有所有的4列(時間,數據,ProcessingTime,& ProcessName)。

首先,我在使用USQL語句將其寫入CSV文件之前,先將它寫入表中。但是,所有空白記錄都會生成CSV輸出。

任何幫助表示讚賞。我也可以通過ADF來做到這一點嗎?我希望將此作爲預定的工作。

以下是我用來編寫CSV文件的USQL代碼。

CREATE ASSEMBLY IF NOT EXISTS [Newtonsoft.Json] FROM 
"C:/Test/Assemblies/Newtonsoft.Json.dll"; 
CREATE ASSEMBLY IF NOT EXISTS [Microsoft.Analytics.Samples.Formats] FROM 
"C:/ADL/Assemblies/Microsoft.Analytics.Samples.Formats.dll"; 

REFERENCE ASSEMBLY [Newtonsoft.Json]; 
REFERENCE ASSEMBLY [Microsoft.Analytics.Samples.Formats]; 

USING Microsoft.Analytics.Samples.Formats.Json; 

DECLARE @path string = @"C:\Test\"; 
DECLARE @input string = @path + @"sample_data1.json"; 
DECLARE @to string = @path + @"output.csv"; 

@jsonFile = 
EXTRACT 
Time string, 
Date string, 
ProcessingTime string, 
ProcessName string 
FROM @input 
USING new JsonExtractor(); 

OUTPUT @jsonFile 
TO @to 
USING Outputters.Csv(); 

乾杯!

回答

1

該文件不包含有效的Json文檔。它似乎是每行一個Json對象。 ADL可以每行處理帶有對象的Json文件,但是每個Json對象都應該寫入一個新行,而不需要任何附加分隔符,因此應該刪除每行末尾的,。就像這樣:

{"ABCD":{"Time":"", "Date":"", "ProcessingTime":"", "ProcessName":""}} 
{"ABCD":{"Date":"", "ProcessingTime":"", "ProcessName":""}} 
{"ABCD":{"ProcessingTime":"", "ProcessName":""}} 
{"ABCD":{"Time":"", "Date":"", "ProcessingTime":"", "ProcessName":""}} 

,那麼你不能直接使用JsonExtractor,你將不得不使用文本提取提取所有單獨的Json線,然後使用JsonTuple方法將其轉換爲JSON:

CREATE ASSEMBLY IF NOT EXISTS [Newtonsoft.Json] FROM 
"C:/Test/Assemblies/Newtonsoft.Json.dll"; 
CREATE ASSEMBLY IF NOT EXISTS [Microsoft.Analytics.Samples.Formats] FROM 
"C:/ADL/Assemblies/Microsoft.Analytics.Samples.Formats.dll"; 

REFERENCE ASSEMBLY [Newtonsoft.Json]; 
REFERENCE ASSEMBLY [Microsoft.Analytics.Samples.Formats]; 

USING Microsoft.Analytics.Samples.Formats.Json; 

DECLARE @path string = @"C:\Test\"; 
DECLARE @input string = @path + @"sample_data1.json"; 
DECLARE @to string = @path + @"output.csv"; 

@RawExtract = EXTRACT [RawString] string 
FROM @input 
USING Extractors.Text(delimiter:'\b', quoting : false); 

@ParsedJSONLines = SELECT JsonFunctions.JsonTuple([RawString]) AS JSONLine 
    FROM @RawExtract; 

@jsonObjects = 
SELECT JsonFunctions.JsonTuple(JSONLine["ABCD"]) AS Abcd 
FROM @ParsedJSONLines; 

@result = 
SELECT 
    Abcd["Time"] AS Time, 
    Abcd["Date"] AS Date, 
    Abcd["ProcessingTime"] AS ProcessingTime, 
    Abcd["ProcessName"] AS ProcessName 
FROM @jsonObjects; 

OUTPUT @result 
TO @to 
USING Outputters.Csv(); 
+0

謝謝彼得!刪除了Json對象之間的逗號並按照上面的建議更新了代碼,但是代碼失敗,出現「加載jarray時意外的內容結束」錯誤。使用Google搜索,但無法診斷錯誤。任何指導非常感謝。 – Rmani

+0

@Rmani進一步檢查我注意到Json輸入仍然無效。我已經更新了答案中的示例輸入。然後我注意到在運行這個工作時顯然你不能使用所有的大寫標識符,所以我在腳本(l.23)中將'AS ADBC'改爲'AS Abcd'。我用我的示例輸入測試了它,並沒有發現錯誤。錯誤是否顯示任何行?你是否使用示例json或其他文件? –

+0

再次感謝彼得!能夠創建CSV文件,有沒有辦法通過USQL刪除JSON對象之間的逗號並插入到Azure表中?我一直在Google上尋找答案,但找不到任何相關信息。 – Rmani

0

根據您對Peter的回覆的評論中的額外說明:

首先,您不能直接使用U-SQL將數據插入到Azure表存儲中。您將不得不使用Azure Data Factory將已清理/已轉換的文件從ADLS移至Azure Table。

我在上面看到的問題是,JSON文檔也包含,以分離它們的屬性。所以一些簡單的方法,如使用行或列分隔符將會失敗。你可以做的是寫類似(替換上面的腳本提取物)

@RawExtract = 
    EXTRACT [RawString] string 
    FROM @input 
    USING Extractors.Text(delimiter:'\b', quoting : false); 

@RawExtract = SELECT RawString.TrimEnd(',') AS RawString FROM @RawExtract; 

砸行的最後一個字符(假設它是一個,或者你可以寫一些其他的C#表達找到最後一個逗號的位置,並使用String.Substring而不是String.TrimEnd)。這假定每個JSON文檔都適合一行並且適合128kB的字符串數據類型。

或者,您必須編寫一個完全理解您的文件格式的自定義提取器,並在提取器UDO屬性atomicFileProcessing設置爲true的情況下在input.baseStream級別進行操作。在GitHub站點上有一些示例提取器,鏈接自http://usql.io,這可能有助於解決這個問題。但我建議先嚐試以上建議。

乾杯 邁克爾

PS:你可以在U型SQL全部大寫標識,但你需要說出來了,例如,AS [ABCD]

+1

謝謝,邁克爾。我能夠通過腳本刪除逗號並創建CSV文件。我知道U-SQL不能用於將數據插入到Azure中表格存儲,將嘗試與ADF。再次感謝您的幫助! – Rmani

相關問題