Улей XML Serdie xpath, восстанавливающий нулевые значения

#xml #hadoop #xpath #hive

#xml #hadoop #xpath #улей

Вопрос:

 I have the sample XML file, Sorry for editing the sample xml missed some tags 



<?xml version="1.0"?>
 <wd:File xmlns:wd="urn:com.workday/bsvc">
 <wd:Report_Entry>
 <wd:All_Candidate_Job_Profiles wd:Descriptor="Manager I">
 <wd:ID wd:type="WID">e83ebdbd2a0a013fcbb5009a49e9d9d4</wd:ID>
 <wd:ID wd:type="Job_Profile_ID">US-100017363</wd:ID>
 </wd:All_Candidate_Job_Profiles>
 <wd:All_Companies_as_Text>Xyz, Inc.</wd:All_Companies_as_Text> 
 <wd:All_Watched_Companies>0</wd:All_Watched_Companies>
 </wd:Report_Entry>
 <wd:Report_Entry>
 <wd:All_Candidate_Job_Profiles wd:Descriptor="Manager II">
 <wd:ID wd:type="WID">e83ebdbd2a0a013fcbb5009a49e9d9d4</wd:ID>
 <wd:ID wd:type="Job_Profile_ID">US-100017363</wd:ID>
 </wd:All_Candidate_Job_Profiles>
 <wd:All_Companies_as_Text>abc, Inc.</wd:All_Companies_as_Text> 
 <wd:All_Watched_Companies>0</wd:All_Watched_Companies>
 </wd:Report_Entry>
 </wd:File>
  

Я пытаюсь загрузить данные, используя следующий запрос:

 CREATE external TABLE ww_hr_dl_staging_hiring.recruiting_candidates_serdie(
        All_Candidate_Job_Profiles array<string>,
        All_Companies_as_Text string,
        All_Watched_Companies string
        )
        ROW FORMAT SERDE 'com.ibm.spss.hive.serde2.xml.XmlSerDe'
        WITH SERDEPROPERTIES (
        'column.xpath.All_Companies_as_Text'='wd:File/wd:Report_Entry/*
        [local-name()="wd:All_Companies_as_Text"]/text()',
        'column.xpath.All_Watched_Companies'='wd:File/wd:Report_Entry/* 
        [local-name()="wd:All_Watched_Companies"]/text()' 
        )
        STORED AS
        INPUTFORMAT 'com.ibm.spss.hive.serde2.xml.XmlInputFormat'
        OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat'
        TBLPROPERTIES (
        'xmlinput.start'='<wd:File xmlns',
        'xmlinput.end'='</wd:File>'
        );
  

Загрузка данных из hdfs с использованием load data inpath ‘путь’ в ‘имя_таблицы’

При выборе данных из запроса я получаю нулевые значения

выберите * из ww_hr_dl_staging_hiring.recruiting_candidates_serdie;

OK NULL NULL

 My output should retreive

Manager I Xyz, Inc 0
Manager II abc inc 0
  

Ответ №1:

Это связано с тем, что используемый вами XPATH не соответствует ни одному элементу. Правильный xpath должен быть.

//*[local-name(.)=»All_Companies_as_Text»]/текст()

//*[local-name(.)=»All_Watched_Companies»]/текст()

Это рабочий код

 CREATE external TABLE temp.recruiting_candidates_serdie(
        All_Companies_as_Text string,
        All_Watched_Companies string
        )
        ROW FORMAT SERDE 'com.ibm.spss.hive.serde2.xml.XmlSerDe'
        WITH SERDEPROPERTIES (
        'column.xpath.All_Companies_as_Text'='//*[local-name(.)="All_Companies_as_Text"]/text()',
        'column.xpath.All_Watched_Companies'='//*[local-name(.)="All_Watched_Companies"]/text()' 
        )
        STORED AS
        INPUTFORMAT 'com.ibm.spss.hive.serde2.xml.XmlInputFormat'
        OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat'
        location '/tmp/test_xml/table'
        TBLPROPERTIES (
        'xmlinput.start'='<wd:File xmlns',
        'xmlinput.end'='</wd:File>'
        )
  

Комментарии:

1. Спасибо, Гауранг. Можете ли вы объяснить изменения в коде?

2. именно так эта serde понимает xpath при использовании namespace . используется еще одна вещь, которую я сделал relative xpath (начиная с double // вместо /)

3. Сработает ли это, если я захочу извлечь значение из этого тега All_Candidate_Job_Profile? <wd:All_Candidate_Job_Profiles wd:Descriptor=»Менеджер III, привлечение талантов — Человеческие ресурсы»>

4. Этот код восстанавливает все значения в виде одной строки. Выходные данные отображаются следующим образом: <string> значения all_companie_as_text</string> <string> значения all_watched_companies></string> Но мне нужен вывод в виде: xyz inc, 0 следующая строка (abc inc, 0)

5. Я протестировал, что все ухудшилось, как и ожидалось. убедитесь, что вы правильно используете xpath. Я формирую базы xpath на основе данного образца, если фактический файл отличается, это может сработать