[英]Hive: best approach to consume large number of small XML files
我想獲得有關將數據存儲在HDFS中以及通過Hive使用SQL進一步從中檢索值的最佳方法的建議。
我收到許多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;
提前致謝!
您可以編寫xslt文件,將傳入的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或parquet而不是簡單文本, 請查看https://github.com/whale2/iow-hadoop-streaming ,此lib還可以處理多個輸出,因此您可以將每個表保存在單獨的文件夾中(當然子文件夾(如果要分區)。
接下來,只需在配置單元中為您生成的文件創建外部表並進行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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.