簡體   English   中英

蜂巢:消耗大量小型XML文件的最佳方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM