我有一个gzip 3gbsxml文件,我想Map到HiveParquet表。我使用xmlserde将该文件解析到临时外部表,然后使用insert将该数据插入到hive parquet表中(我希望该数据被放置在hive表中,而不是在hdfs上创建xml文件的接口)。
我想到了这个剧本:
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,而是只解析一次整个文件,然后将结果放入parquet表中。运行上面的脚本需要无限的时间,另外在日志中,我可以看到只有一个Map器被使用。
我真的不知道这是否是正确的方法(也许用分区可以做到这一点?)
顺便说一句,我用的是cloudera的色调。
暂无答案!
目前还没有任何答案,快来回答吧!