解析 XML 并存储在 Hive 表中
Posted
技术标签:
【中文标题】解析 XML 并存储在 Hive 表中【英文标题】:Parse XML and store in Hive table 【发布时间】:2016-12-23 10:50:19 【问题描述】:我正在使用 XPath 使用 pig 解析 XML,但在我的用例中,我必须解析整个 xml 文件并将其移动到 hive强>表。我正在考虑使用 XPath 来解析 XML 文件,而不是使用 pig 将解析后的数据移动到配置单元表中。但是有没有其他方法可以做到这一点?
【问题讨论】:
能否提供示例xml文件? @SandeepSingh 实际上它对我的公司来说是机密的,而且还有非常敏感的数据,所以我不能分享它。您可以将其视为 30000 行 XML 数据。 我能理解。您可以使用 Hive 和 XPath 解析 XML 文件。根据这些信息,我可以提出一个答案。请看下面。 【参考方案1】:我们可以在 Hive 中使用 hivexmlserde 解析 XML 文件。
使用 hivexmlserde 创建一个外部 Hive 表,并将所有 xml 文件放在该 xml 位置(所有 xml 文件应该相似)。使用此 serde,您需要在 create table 语句中定义开始和结束标记以及要获取的属性的 XPath。
请看下面的例子。
add jar /home/udf_jars/hivexmlserde-1.0.5.3.jar;
CREATE EXTERNAL TABLE hive_test_xml(
col1 string,
col2 string,
col3 string
)
ROW FORMAT SERDE 'com.ibm.spss.hive.serde2.xml.XmlSerDe'
WITH SERDEPROPERTIES (
"column.xpath.col1"="/Books/col1/text()",
"column.xpath.col2"="/Books/col2/text()",
"column.xpath.col3"="/Books/col3/text()"
)
STORED AS
INPUTFORMAT 'com.ibm.spss.hive.serde2.xml.XmlInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat'
LOCATION ' /user/user1/xml/data'
TBLPROPERTIES (
"xmlinput.start"="<Books",
"xmlinput.end"="</Books>");
如需更多详细信息,请访问Hive-XML-Options 链接了解更多信息。
更新:如何从表格中选择数据。
您需要在查询前添加hivexmlserde-1.0.5.3.jar
。请看下面的例子。
hive> add jar /path/to/jar/hivexmlserde-1.0.5.3.jar;
Added [add jar /path/to/jar/hivexmlserde-1.0.5.3.jar] to class path
Added resources: [add jar /path/to/jar/hivexmlserde-1.0.5.3.jar]
hive> use mydatabase_name;
OK
Time taken: 0.021 seconds
hive> select * from xm_table;
您还可以永久设置此jar,以避免在查询之前一直添加。请点击以下链接
Adding/Defining Jars in Hive permanently
【讨论】:
非常感谢您的帮助。 我有一个问题可以将我的所有 xml 文件放在同一文件夹中的一个位置,例如LOCATION ' /user/user1/xml/data/'
其中 data 是我的文件夹名称吗?
是的,你可以放,如果所有的xml文件都具有相似的结构。
非常感谢您的帮助。
由于您的表是外部表,您只需将其他xml文件复制到表HDFS位置。无论那里有什么文件,都会反映到那个特定的表中。以上是关于解析 XML 并存储在 Hive 表中的主要内容,如果未能解决你的问题,请参考以下文章
Spark&Hive:如何使用scala开发spark作业,并访问hive。