私はHiveQLにかなり慣れていないので、ちょっと行き詰まっています:S
xml 形式で保存されたデータがあり、列の Hive テーブル (文字列 Titles_2 、文字列 Artists_2、文字列 Albums_2) でこの xml ファイルからフィールドを抽出したいと考えています。
xml データのサンプル:
<?xml version="1.0" encoding="UTF-8"?><MC><SC><S uid="2" gen="" yr="2011" art="Samsung" cmp="<unknown>" fld="/mnt/sdcard/Samsung/Music" alb="Samsung" ttl="Over the horizon"/><S uid="37" gen="" yr="2010" art="Jason Derulo" cmp="<unknown>" fld="/mnt/sdcard/Music/Jason Derulo/Jason Derulo" alb="Jason Derulo" ttl="Whatcha Say"/><S uid="38" gen="" yr="2010" art="Jason Derulo" cmp="<unknown>" fld="/mnt/sdcard/Music/Jason Derulo/Jason Derulo" alb="Jason Derulo" ttl="In My Head"/><S uid="39" gen="" yr="2011" art="Alexandra Stan" cmp="<unknown>" fld="/mnt/sdcard/Music/Alexandra Stan/Mr_ Saxobeat - Single" alb="Mr. Saxobeat - Single" ttl="Mr. Saxobeat (Extended Version)"/><S uid="40" gen="" yr="2011" art="Bushido" cmp="<unknown>" fld="/mnt/sdcard/Music/Bushido/Jenseits von Gut und Böse (Premium Edition)" alb="Jenseits von Gut und Böse (Premium Edition)" ttl="Wie ein Löwe"/><S uid="41" gen="" yr="2011" art="Bushido" cmp="<unknown>" fld="/mnt/sdcard/Music/Bushido/Jenseits von Gut und Böse (Premium Edition)" alb="Jenseits von Gut und Böse (Premium Edition)" ttl="Verreckt"/><S uid="42" gen="" yr="2011" art="Lucenzo" cmp="<unknown>" fld="/mnt/sdcard/Music/Lucenzo/Danza Kuduro (feat_ Don Omar) [From _Fast & Furious 5_] - Single" alb="Danza Kuduro (feat. Don Omar) [From "Fast & Furious 5"] - Single" ttl="Danza Kuduro (feat. Don Omar) [From "Fast & Furious 5"]"/><S uid="121" gen="" yr="701" art="Michael Jackson" cmp="<unknown>" fld="/mnt/sdcard/external_sd/Music/Michael Jackson/Bad [Bonus Tracks]" alb="Bad [Bonus Tracks]" ttl="Voice-Over Intro/Quincy Jones Interview #1 [*]"/></SC><PC/></MC>
このデータは xmlout_2(line) というテーブルに格納されます。
これらの xpath コマンドを実行して HiveQL テーブル Stores を作成しましたが、各行の最初の曲しか追加されません。なぜそのように振る舞うのですか?
create view xmlout_2(line) as SELECT * from hivetesttable;
CREATE VIEW Stores(Titles_2, Artists_2, Albums_2) AS
SELECT
xpath_string ( line, '/MC/SC/*/@ttl'),
xpath_string (line, 'MC/SC/*/@art'),
xpath_string (line, '/MC/SC/*/@alb')
FROM xmlout_2;
xpath_string の代わりに xpath を試すと、文字列ではなく文字列の配列が得られます。
create view xmlout_2(line) as SELECT * from hivetesttable;
CREATE VIEW Stores(Titles_2, Artists_2, Albums_2) AS
SELECT
xpath ( line, '/MC/SC/*/@ttl'),
xpath (line, 'MC/SC/*/@art'),
xpath (line, '/MC/SC/*/@alb')
FROM xmlout_2;
その後、列を爆発させることを考えていますが、爆発は単一の列でしか使用できません。