我想获得有关在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;
提前致谢!
答案 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