2016-03-21 59 views
0

我想獲得有關將數據存儲在HDFS中的最佳方法以及通過Hive使用SQL進一步檢索值的建議。Hive:消耗大量小型XML文件的最佳方法

我收到很多XML格式的文件,基本上每天幾萬。每個文件大約有10 kB,並遵循給定的XSD模式。目前,我有超過120 TB的這些XML文件存儲在文件系統中。

我想知道將所有這些XML文件接收到HDFS中,以便爲某些應用程序提供SQL接口,以便對數據執行關係查詢。

您認爲我需要哪些關鍵技術來構建此解決方案?

爲了高效處理,可能需要將這些XML文件轉換爲Hadoop(即RCfile或ORC)的更好格式並將它們存儲在HDFS中。問題是這些文件的模式預計會隨着時間而改變。我的數據的性質似乎受益於分區(即按日期/時間或狀態)。另外,我不知道數據壓縮是不是一個好主意。

下面是一個簡單的內容我有一個XML文件中:

<invoice schema_version="1.1"> 
    <general id="123456798"> 
    <creationdate>2016-03-21 16:25:09-03:00</creationdate> 
    </general> 
    <buyer id="11"> 
    <name>The Buyer</name> 
    <address> 
     <street>1st St</street> 
     <city>Los Angeles</city> 
     <state>CA</state> 
    </address> 
    </buyer> 
    <seller id="22"> 
    <name>The Seller</name> 
    <address> 
     <street>2nd Ave</street> 
     <city>Miami</city> 
     <state>FL</state> 
    </address> 
    </seller> 
    <items> 
    <product id="123"> 
     <name>Blue Pen</name> 
     <price>1.50</price> 
     <quantity>4</quantity> 
     <subtotal>6.00</subtotal> 
    </product> 
    <product id="456"> 
     <name>White Board</name> 
     <price>5.20</price> 
     <quantity>2</quantity> 
     <subtotal>10.40</subtotal> 
    </product> 
    </items> 
    <amount> 
    <products>16.40</products> 
    <shipping>2.35</shipping> 
    <total>18.75</shipping> 
    </amount> 
</invoice> 

因此,我想執行SQL查詢類似以下:提前

SELECT general.creationdate, buyer.name, amount.total 
FROM invoice 
WHERE general_id = '123456798'; 

SELECT count(*) AS qty, sum(amount.total) AS total 
FROM invoice 
WHERE general.creationdate >= '2016-03-01' 
GROUP BY seller.address.state; 

SELECT b.name, avg(b.price) AS avg_price, sum(b.quantity) AS sum_quantity 
FROM invoice a 
    JOIN invoice_items b ON (...) 
WHERE a.buyer.address.state = 'CA' 
GROUP BY b.name 
ORDER BY sum_quantity DESC; 

謝謝!

回答

0

您可以編寫xslt-file將傳入的xml轉換爲csv格式並將其應用於您的文件,例如使用流工作:

hadoop jar hadoop-streaming.jar \ 
    -mapper 'xsltproc file.xslt -' -file file.xslt \ 
    -input /path/to/your/xmls \ 
    -output /path/to/resulting/files 

外觀上,如果你想使用的Avro或實木複合地板,而不是簡單的文本,這LIB還可以處理多個輸出,這樣可以節省在不同的文件夾中的每個表(https://github.com/whale2/iow-hadoop-streaming和ofcourse子文件夾,如果你想要分區)。

接下來,只需在您的結果文件的配置單元中創建外部表並進行sql查詢。

如果您的模式將改變,您可以更改xslt文件。

地址:,使其工作,你應該從輸入個XML刪除換行或寫的包裝(見http://www.science.smith.edu/dftwiki/index.php/Hadoop_Tutorial_2.1_--_Streaming_XML_Files

UPD 你應該寫1個XSLT來產生alll記錄在文件中像這樣:

header\tval1,val2,val3 
details\tval1,val2,val3,val4 

接下來,添加選項-outputformat net.iponweb.hadoop.streaming.io.ByKeyOutputFormat給你的命令,你會得到每個鍵的不同文件。

怎麼樣在這個任務中Hadoop的利潤 - 分佈式處理,如果你有少量的數據,你不需要的Hadoop

+0

我能創造2個獨立的XSLT文件,header.xsl和details.xslt,其中,從一個invoice.xml文件中分別生成header.csv和details.csv。我通過直接運行xsltproc來測試它,所以我可以構建一個Shell腳本來自動執行此操作。在這種情況下,通過Hadoop Streaming運行「XML到CSV轉換」的主要原因是什麼? –

+0

查看已更新的答案 – fi11er

+0

一旦我創建了CSV文件並將它們上載到Hadoop邊緣節點,就像我使用「hadoop fs -copyFromLocal」一樣,它花費了大量時間將其吸收到HDFS中。這就是使用這種Hadoop Streaming方法的要點嗎? –

相關問題