首页 > 解决方案 > 在将数据插入 Hive 表之前加载 xml 文件并映射给定的列

问题描述

我想将 XML 文件加载到配置单元列中,但在此之前我需要使用给定的映射值对某些字段进行一些映射。

例子:

我有一个这样的xml文件:

<?xml version="1.0"?>
<Company>
  <Employee>
      <FirstName>Test1</FirstName>
      <LastName>toto1</LastName>
      <ContactNo>111</ContactNo>
      <Email>toto1@xyz.com</Email>
      <Address>
           <City>Bangalore</City>
           <State>Karnataka</State>
           <Zip>560212</Zip>
      </Address>
  </Employee>
    <Employee>
      <FirstName>Test2</FirstName>
      <LastName>toto2</LastName>
      <ContactNo>222</ContactNo>
      <Email>toto2@xyz.com</Email>
      <Address>
           <City>Bangalore</City>
           <State>Karnataka</State>
           <Zip>545454</Zip>
      </Address>
  </Employee>
    <Employee>
      <FirstName>Test3</FirstName>
      <LastName>toto3</LastName>
      <ContactNo>333</ContactNo>
      <Email>toto3@xyz.com</Email>
      <Address>
           <City>Bangalore</City>
           <State>Karnataka</State>
           <Zip>36363</Zip>
      </Address>
  </Employee>
</Company>

我这样做是为了在 Hive 中加载文件,它对我有用。

添加 jar ${projet}/datagaps_xml_traite/hivexmlserde-1.0.5.3.jar;

删除表如果存在员工;

CREATE external TABLE Employee(
(FirstName STRING,LastName STRING,ContactNo STRING,Email STRING,City STRING,State STRING,Zip STRING)
ROW FORMAT SERDE 'com.ibm.spss.hive.serde2.xml.XmlSerDe'
WITH SERDEPROPERTIES ( 
"column.xpath.FirstName"="/Employee/FirstName/text()",
"column.xpath.LastName"="//Employee/LastName/text()",
"column.xpath.ContactNo"="/Employee/ContactNo/text()",
"column.xpath.City"="/Employee/Address/City/text()",
"column.xpath.State"="/Employee/Address/State/text()",
"column.xpath.Zip"="/Employee/Address/Zip/text()",
)
STORED AS
INPUTFORMAT 'com.ibm.spss.hive.serde2.xml.XmlInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat'
LOCATION '/data/myFile.xml/'
TBLPROPERTIES (
"xmlinput.start"="<Employee",
"xmlinput.end"="</Employee>" ) 
;

现在,我有一个这样的地图:

contactNo,identif
111,       XXX
222,       YYY
333,       ZZZ

我想用它的 identif 映射每个 contactNo 并在 Hive 中插入 identif 值。

有人可以指导我解决这个问题。

标签: shellapache-sparkhiveoozie-workflow

解决方案


推荐阅读