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 1Pytamy 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 2Pró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.