hive:使用大量小xml文件的最佳方法

mxg2im7a  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(382)

我想得到关于在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;

提前谢谢!

bcs8qyzn

bcs8qyzn1#

您可以编写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

看着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来生成文件中的所有记录,如下所示:

header\tval1,val2,val3
details\tval1,val2,val3,val4

接下来,添加选项 -outputformat net.iponweb.hadoop.streaming.io.ByKeyOutputFormat 你的命令,你得到不同的文件为每个关键。
在这个任务分布式处理中,hadoop的利润如何呢?如果你有少量的数据,你就不需要hadoop了

相关问题