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

时间:2016-03-21 20:20:36

标签: sql xml hadoop hive hdfs

我想获得有关在HDFS中存储数据的最佳方法的建议,以及通过Hive从SQL中进一步检索值。

我收到了很多XML格式的文件,基本上每天都有成千上万的文件。每个文件大约10 kB并遵循给定的XSD架构。目前,我有超过120 TB的这些XML文件存储在文件系统中。

我想知道将所有这些XML文件摄取到HDFS中,以便为某些应用程序提供SQL接口,以对数据执行关系查询。

您认为构建此解决方案需要哪些关键技术?

为了有效处理,我可能需要以更好的格式为Hadoop(即RCfile或ORC)转换这些XML文件,并将它们存储在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;

提前致谢!

1 个答案:

答案 0 :(得分: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

查看https://github.com/whale2/iow-hadoop-streaming如果你想使用avro或者镶木地板而不是简单的文本,这个lib也可以处理多个输出,所以你可以将每个表保存在单独的文件夹中(如果你想要分区,可以保存在子文件夹中)。

接下来,只需在配置单元中创建外部表到您生成的文件并进行SQL查询。

如果您的架构会发生变化,您只需更改xslt-file。

添加:要使其正常工作,您应该从输入xmls或写入包装器中删除换行符(请参阅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