xml - Hive - XML- Serde - 键值对 - 创建表

标签 xml hadoop xpath hive hive-serde

键值对组合。我们正在尝试将 ID 分解为列名,并将 VALUE 分解为每一列的相应数据。

`<CT> <items> <item> <field> <id>Column1</id> <value>25672</value> </field> 
 <field> <id>Column2</id> <value>FGE</value> </field> <field> 
 <id>Column3</id> <value>Florence to Venice</value> </field> </item> 
 </items> 
 </CT>`

我们希望创建一个如下表, 预期输出:

Column1 Column2 Column3
25672   FGE     Florence to Venice

我们尝试使用 Map 来提取键值对,但我们没有得到想要的结果。

'CREATE EXTERNAL TABLE dev.reference_test(
PM_SubCollection array<map<string,string>>
)
ROW FORMAT SERDE 'com.ibm.spss.hive.serde2.xml.XmlSerDe'
WITH SERDEPROPERTIES(
"column.xpath.PM_SubCollection"="/CT/items/item/field",
"xml.map.specification.id"="#id->#value"
)
STORED AS
INPUTFORMAT 'com.ibm.spss.hive.serde2.xml.XmlInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat'
LOCATION '/dev/reference_test'
TBLPROPERTIES (
"xmlinput.start"="",
"xmlinput.end"=""
);'


Output:
'[{"field":"Column125672"},{"field":"Column2FGE"},{"field":"Column3Florence to Venice"}]'

任何建议都会有帮助

最佳答案

参见 https://github.com/dvasilen/Hive-XML-SerDe/issues/42

如果您必须从以下 XML 中捕获消息 id 以及 id 和值

<?xml version="1.0" encoding="UTF-8"?>
<CT>
   <messageID>11736</messageID>
   <items>
      <item>
         <field>
            <id>Column1</id>
            <value>25672</value>
         </field>
         <field>
            <id>Column2</id>
            <value>FGE</value>
         </field>
         <field>
            <id>Column3</id>
            <value>Florence to Venice</value>
         </field>
      </item>
   </items>
</CT>

然后我会使用如下所示的 DDL:

DROP TABLE IF EXISTS xml_42a;

CREATE  TABLE xml_42a(
message_id string,
fields array<struct<field:struct<id:string,value:string>>>
)
ROW FORMAT SERDE 'com.ibm.spss.hive.serde2.xml.XmlSerDe'
WITH SERDEPROPERTIES(
  "column.xpath.message_id"="/CT/messageID/text()",
  "column.xpath.fields"="/CT/items/item/field"
  )
STORED AS 
INPUTFORMAT 'com.ibm.spss.hive.serde2.xml.XmlInputFormat' 
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat' 
TBLPROPERTIES (
"xmlinput.start"="<CT>",
"xmlinput.end"="</CT>"
);

load data local inpath '/Users/dvasilen/Misc/XML/42a.xml' OVERWRITE into table xml_42a;

select * from xml_42a; 

这是输出:

hive> 
    > select * from xml_42a; 
OK
11736   [{"field":{"id":"Column1","value":"25672"}},{"field":{"id":"Column2","value":"FGE"}},{"field":{"id":"Column3","value":"Florence to Venice"}}]
Time taken: 0.08 seconds, Fetched: 1 row(s)

关于xml - Hive - XML- Serde - 键值对 - 创建表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44976176/

相关文章:

sql-server - 如何从节点获取值(value)? SQL Server XML dml

hadoop - Nutch : org. apache.hadoop.mapreduce.lib.input.InvalidInputException: 输入路径不存在

java - 将文件分割成大小大于127的 block

php - PHP 中 XPath 的 'undefined namespace prefix' 问题?

java - XPathExpression 无法对数字求和

javascript - jQuery 通过 XPath 选择元素

java - 如何以编程方式隐藏 android 一些但不是全部的 XML 输出中的查看项目?

java - 将 pdf 转换为 xml

python - 从 XML 文档中获取所有文本?

scala - Spark 在大型洗牌作业上失败,出现 java.io.IOException : Filesystem closed