Извлечение данных из строки XML в таблице Hive без использования XPath - PullRequest
0 голосов
/ 03 февраля 2020

Я пытаюсь использовать представление для извлечения строки (значения) из большой строки XML, которая находится в одном столбце в таблице улья. Мне нужно получить соответствующее FOO_STRING_VALUE для COMPANY_ID, SALE_IND и CLOSING_IND.

    <Message>
        <Header>
            <FOO_STRING>
                <FOO_STRING_NAME>COMPANY_ID</FOO_STRING_NAME>
                <FOO_STRING_VALUE>44-1235</FOO_STRING_VALUE>
            </FOO_STRING>
            <FOO_STRING>
                <FOO_STRING_NAME>SALE_IND</FOO_STRING_NAME>
                <FOO_STRING_VALUE>Y</FOO_STRING_VALUE>
            </FOO_STRING>
            <FOO_STRING>
                <FOO_STRING_NAME>CLOSING_IND</FOO_STRING_NAME>
                <FOO_STRING_VALUE>Y</FOO_STRING_VALUE>
            </FOO_STRING>
        </Header>
    </Message>

Файл XML может содержать до 50 «FOO_STRINGS», и нет никакой гарантии, в каком порядке они будут, поэтому я не могу использовать XPATH, если у меня нет 50 вызовов xpath_string для каждого имени / Значение пары и сопоставить их позже. Я использую xpath вот так .....

       xpath_string(xml_txt, '/Message/Header/FOO_STRING[1]/FOO_STRING_VALUE') AS String_Val_1                   
       xpath_string(xml_txt, '/Message/Header/FOO_STRING[2]/FOO_STRING_VALUE') AS String_Val_2                                                        
       xpath_string(xml_txt, '/Message/Header/FOO_STRING[3]/FOO_STRING_VALUE') AS String_Val_3                     

Однако, если порядок меняется, он не работает. Мне интересно, есть ли быстрый способ найти нужный FOO_STRING_NAME и получить соответствующее значение, используя regexp_extract() или каким-либо другим способом? Я не знаком с Regex, поэтому любая помощь или предложения будут полезны, спасибо за тонну

1 Ответ

0 голосов
/ 04 февраля 2020

"если ордер меняется, то он не работает"

Тогда не используйте позицию.

xpath_string(xml_txt, '/Message/Header/FOO_STRING[FOO_STRING_NAME="COMPANY_ID"]/FOO_STRING_VALUE') AS String_Val_1                   
xpath_string(xml_txt, '/Message/Header/FOO_STRING[FOO_STRING_NAME="SALE_IND"]/FOO_STRING_VALUE') AS String_Val_2                                                        
xpath_string(xml_txt, '/Message/Header/FOO_STRING[FOO_STRING_NAME="CLOSING_IND"]/FOO_STRING_VALUE') AS String_Val_3 
...