Hive XML вложенный массив структур - PullRequest
0 голосов
/ 31 августа 2018

Итак, у меня есть этот XML-файл:

<?xml version="1.0" encoding="UTF-8"?>
<pfx:BusinessUnits xmlns:pfx="http://someurl" xmlns:xsi="http://someurl" xsi:schemaLocation="http://someurl BusinessUnitDetails.xsd">
<businessUnit xmlns="http://someurl">
    <businessUnit>
        <name>store one</name>
        <number>1</number>
    </businessUnit>
    <Departments>
        <number>8</number>
        <description>division eight</description>
        <contact>
            <phone>
                <number>123456789</number>
                <type>primary</type>
            </phone>
            <type>MAIN PHONE 1</type>
            <contact>
            <phone>
                <number>987654321</number>
                <type>secondary</type>
            </phone>
            <type>MAIN PHONE 2</type>
        </contact>
    <Departments>
    <Departments>
        <number>10</number>
        <description>division 2</description>
        <contact>
            <phone>
                <number>123456789</number>
                <type>primary</type>
            </phone>
            <type>MAIN PHONE 1</type>
            <contact>
            <phone>
                <number>987654321</number>
                <type>secondary</type>
            </phone>
            <type>MAIN PHONE 2</type>
        </contact>
    <Departments>
</businessUnit>                                                          
</pfx:BusinessUnits>

Вот массив структур, а внутри это еще один массив структур. Я должен загрузить этот файл в куст. Поэтому я использую улей XML Serde.

  CREATE TABLE mydatabase.xmlLoad(
    store_nbr INT,
divisions 
array<
    struct<
        divisionDepartments:struct<
            number:string,
            contact:array<struct<
                phone:struct<
                    number:string,
                    type:string>,
                type:string
            >
        >>
    >
>
)
ROW FORMAT SERDE 'com.ibm.spss.hive.serde2.xml.XmlSerDe'
WITH SERDEPROPERTIES (
'column.xpath.store_nbr'='/*[local-name()="businessUnitDetail"]/*[local-name()="businessUnit"]/*[local-name()="number"]/text()',
'column.xpath.divisions'='/*[local-name()="businessUnitDetail"]/*[local-name()="divisionDepartments"]/*'
)
STORED AS
INPUTFORMAT 'com.ibm.spss.hive.serde2.xml.XmlInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat'
TBLPROPERTIES (
'xmlinput.start'='<businessUnitDetail',
'xmlinput.end'='</businessUnitDetail>'
);

Я хочу взять номер магазина, номер отдела и информацию о контактах, где только ГЛАВНЫЙ ТЕЛЕФОН 1.

к сожалению, результаты дают мне нулевой результат.

вывод:

store_nbr
48
98
99
100

 Departments
[{"Departments":null},{"Departments":null},{"divisiondepartments":null},{"Departments":null},{"Departments":null},{"divisiondepartments":null},{"Departments":null},{"Departments":null},

ожидаемый результат:

store_nbr | Division_NBR | contact_type | phone_nbr 1 8 ГЛАВНЫЙ ТЕЛЕФОН 1 123456789 2 10 ГЛАВНЫЙ ТЕЛЕФОН 1 987654321

Как мне достичь этого результата?

...