我有一个gzip压缩3GB的xml文件,我想映射到Hive镶木桌子。 我使用xml serde将该文件解析为临时外部表,而不是使用INSERT将此数据插入到hive镶木桌中(我希望将这些数据放在Hive表上,而不是创建xml接口) HDFS上的文件)。
我想出了这个剧本:
CREATE TEMPORARY EXTERNAL TABLE temp_table (someData1 INT, someData2 STRING, someData3 ARRAY<STRING>)
ROW FORMAT SERDE 'com.ibm.spss.hive.serde2.xml.XmlSerDe'
WITH SERDEPROPERTIES (
"column.xpath.someData1" ="someXpath1/text()",
"column.xpath.someData2"="someXpath2/text()",
"column.xpath.someData3"="someXpath3/text()",
)
STORED AS
INPUTFORMAT 'com.ibm.spss.hive.serde2.xml.XmlInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat'
LOCATION 'hdfs://locationToGzippedXmlFile'
TBLPROPERTIES (
"xmlinput.start"="<MyItem>",
"xmlinput.end"="</MyItem>"
);
CREATE TABLE parquet_table
STORED AS Parquet
AS select * from temp_table
这一点的主要观点是我希望有一种优化的方式来访问数据。我不想在每个查询中解析xml而是解析整个文件一次并将结果放入镶木桌中。并且运行上面的脚本在日志中额外花费了无限的时间我可以看到只使用了1个映射器。
我真的不知道它是否是正确的方法(也许它可以用分区做到这一点?)
顺便说一句,我使用Hue和cloudera。