Eksploduje wiersz danych XML w gałęzi Hive

Mamy dane XML załadowane do Hadoop jako pojedyncza kolumna o nazwie XML. Próbujemy pobrać poziomy danych i znormalizować je lub rozbić na pojedyncze wiersze w celu przetworzenia (wiesz, jak tabela!).

SAMPLE XML
<Reports>
<Report ID="1">
<Locations>
  <Location ID="20001">
    <LocationName>Irvine Animal Shelter</LocationName>
  </Location>   
  <Location ID="20002">
    <LocationName>Irvine City Hall</LocationName>
  </Location>   
  </Locations>
</Report>
<Report ID="2">
<Locations>
  <Location ID="10001">
    <LocationName>California Fish Grill</LocationName>
  </Location>   
  <Location ID="10002">
    <LocationName>Fukada</LocationName>
  </Location>   
  </Locations>
</Report>
</Reports>
QUERY 1

Pytamy o wyższy poziom Report.Id, a następnie id i nazwę od dziecka (Lokalizacje / Lokalizacja). Poniżej podano zasadniczo produkt kartezjański wszystkich możliwych kombinacji (w tym przykładzie 8 wierszy zamiast 4, na które liczymy).

SELECT xpath_int(xml, '/Reports/Report/@ID') AS id, location_id, location_name 
FROM   xmlreports 
LATERAL VIEW explode(xpath(xml, '/Reports/Report/Locations/Location/@ID')) myTable1 AS location_id 
LATERAL VIEW explode(xpath(xml, '/Reports/Report/Locations/Location/LocationName/text()')) myTable2 AS location_name;
QUERY 2

Próbowano zgrupować w strukturę, a następnie rozbić, ale to zwraca dwa wiersze i dwie tablice.

SELECT id, loc.col1, loc.col2
FROM (
SELECT xpath_int(xml, '/Reports/Report/@ID') AS id, 
       array(struct(xpath(xml, '/Reports/Report/Locations/Location/@ID'), xpath(xml,     '/Reports/Report/Locations/Location/LocationName/text()'))) As foo
FROM   xmlreports) x
LATERAL VIEW explode(foo) exploded_table as loc;

WYNIKI

1   ["20001","20002"]       ["Irvine Animal Shelter","Irvine City Hall"]
2   ["10001","10002"]       ["California Fish Grill","Irvine Spectrum"]

CO CHCEMY

1   "20001" "Irvine Animal Shelter"
1   "20002" "Irvine City Hall"
2   "10001" "California Fish Grill"
2   "10002" "Irvine Spectrum"

Wydaje się, że to coś wspólnego, ale nie mogę znaleźć żadnych przykładów. Każda pomoc jest bardzo mile widziana.

questionAnswers(1)

yourAnswerToTheQuestion