我想得到关于在hdfs中存储数据的最佳方法的建议,并通过配置单元使用sql从中进一步检索值。
我收到很多xml格式的文件,基本上每天都有上万个。每个文件大约有10kb,并且遵循给定的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;
提前谢谢!
1条答案
按热度按时间bcs8qyzn1#
您可以编写xslt文件,将传入的xml转换为csv格式,并将其应用于您的文件,例如使用流作业:
看着https://github.com/whale2/iow-hadoop-streaming 如果您想使用avro或parquet而不是简单的文本,这个lib还可以处理多个输出,所以您可以将每个表保存在单独的文件夹中(当然,如果您想分区,还可以保存子文件夹)。
接下来,只需在配置单元中为生成的文件创建外部表,并进行sql查询。
如果您的模式要更改,您可以只更改xslt文件。
添加:要使其正常工作,您应该从输入XML中删除换行符或编写 Package 器(请参阅http://www.science.smith.edu/dftwiki/index.php/hadoop_tutorial_2.1_--_streaming_xml_files)
upd您应该编写1个xslt来生成文件中的所有记录,如下所示:
接下来,添加选项
-outputformat net.iponweb.hadoop.streaming.io.ByKeyOutputFormat
你的命令,你得到不同的文件为每个关键。在这个任务分布式处理中,hadoop的利润如何呢?如果你有少量的数据,你就不需要hadoop了