我想獲得有關將數據存儲在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;
謝謝!
我能創造2個獨立的XSLT文件,header.xsl和details.xslt,其中,從一個invoice.xml文件中分別生成header.csv和details.csv。我通過直接運行xsltproc來測試它,所以我可以構建一個Shell腳本來自動執行此操作。在這種情況下,通過Hadoop Streaming運行「XML到CSV轉換」的主要原因是什麼? –
查看已更新的答案 – fi11er
一旦我創建了CSV文件並將它們上載到Hadoop邊緣節點,就像我使用「hadoop fs -copyFromLocal」一樣,它花費了大量時間將其吸收到HDFS中。這就是使用這種Hadoop Streaming方法的要點嗎? –