1

私はHiveQLにかなり慣れていないので、ちょっと行き詰まっています:S

次のスキーマのテーブルがあります。res という名前の 1 つの列と、fileed という名前の partition_column の下にパーティション化された 3 つの列。

create table results( res string) PARTITIONED BY (field STRING); 

次に、このテーブルにデータをインポートしました

insert overwrite table results PARTITION (field= 'title') SELECT  explode(line) AS myNewCol FROM titles ;
insert overwrite table results PARTITION (field= 'artist') SELECT  explode(line) AS myNewCol FROM artist;
insert overwrite table results PARTITION (field= 'albums') SELECT  explode(line) AS myNewCol FROM albums;

3 つのパーティション内の一意のチューブを数えようとしています。

たとえば、このコマンドは、データセット内の特定のタイトルの存在数をカウントします。

 SELECT res, count(1) AS counttotal   FROM results where field='title' GROUP BY res ORDER BY counttotal;

そしてそれは次のようなものを出力します

 title                                count        
 Hit me Baby More time                   9

これをタプル (タイトル、アルバム、アーティスト) に拡張するにはどうすればよいですか? 次のような出力が必要な場合:

title                            album                 artist       count

Baby one more time    hit me baby one more time    britney spears    9

私のコード全体:

CREATE EXTERNAL TABLE IF NOT EXISTS hivetesttable  (
xmldata STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
location '/user/sdasd/hivetestdata/';

create view xmlout(line) as  select * from hivetesttable;  

CREATE VIEW TITLES(line) as select xpath(line,'/MC/SC/*/@ttl')  from xmlout;
CREATE VIEW ARTIST(line) as select  xpath(line,'/MC/SC/*/@art')  from xmlout;
CREATE VIEW ALBUMS( line) as select   xpath(line,'/MC/SC/*/@art') from xmlout;



create table results( res string) PARTITIONED BY (field STRING); 
insert overwrite table results PARTITION (field= 'title') SELECT  explode(line) AS myNewCol FROM titles ;
insert overwrite table results PARTITION (field= 'artist') SELECT  explode(line) AS myNewCol FROM artist;
insert overwrite table results PARTITION (field= 'albums') SELECT  explode(line) AS myNewCol FROM albums;

SELECT res, count(1) AS counttotal   FROM results where field='title' GROUP BY res ORDER BY counttotal;

xmlデータの行は次のようになります

<?xml version="1.0" encoding="UTF-8"?><MC><SC><S uid="2" gen="" yr="2011" art="Samsung" cmp="&lt;unknown&gt;" fld="/mnt/sdcard/Samsung/Music" alb="Samsung" ttl="Over the horizon"/><S uid="37" gen="" yr="2010" art="Jason Derulo" cmp="&lt;unknown&gt;" fld="/mnt/sdcard/Music/Jason Derulo/Jason Derulo" alb="Jason Derulo" ttl="Whatcha Say"/><S uid="38" gen="" yr="2010" art="Jason Derulo" cmp="&lt;unknown&gt;" 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="&lt;unknown&gt;" 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="&lt;unknown&gt;" 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="&lt;unknown&gt;" 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="&lt;unknown&gt;" fld="/mnt/sdcard/Music/Lucenzo/Danza Kuduro (feat_ Don Omar) [From _Fast &amp; Furious 5_] - Single" alb="Danza Kuduro (feat. Don Omar) [From &quot;Fast &amp; Furious 5&quot;] - Single" ttl="Danza Kuduro (feat. Don Omar) [From &quot;Fast &amp; Furious 5&quot;]"/><S uid="121" gen="" yr="701" art="Michael Jackson" cmp="&lt;unknown&gt;" 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>
4

1 に答える 1

1

あなたが提供した情報に基づいて、あなたが望む出力は不可能です。現在、次のようなテーブルがあります。

res                           field
---                           -----
baby one more time            title
baby one more time            title
baby one more time            title
baby one more time            title
baby one more time            title
baby one more time            title
baby one more time            title
baby one more time            title
baby one more time            title
hit me baby one more time     album
hit me baby one more time     album
hit me baby one more time     album
hit me baby one more time     album
hit me baby one more time     album
hit me baby one more time     album
hit me baby one more time     album
hit me baby one more time     album
hit me baby one more time     album
britney spears                artist
britney spears                artist
britney spears                artist
britney spears                artist
britney spears                artist
britney spears                artist
britney spears                artist
britney spears                artist
britney spears                artist
the distance                  title
the distance                  title
open book                     title
daria                         title
fashion nugget                album
fashion nugget                album
fashion nugget                album
fashion nugget                album
cake                          artist
cake                          artist
cake                          artist
cake                          artist

パーティション化したため、Hive はたまたま 3 つの異なるフォルダーに格納しますが、これはクエリの結果には影響しません。追加のトラックをいくつか追加しました。追加のトラックを出力したいと思います(間違っている場合は修正してください):

title                  album                       artist              count
baby one more time     hit me baby one mroe time   britney spears      9
the distance           fashion nuggets             cake                2
open book              fashion nuggets             cake                1
daria                  fashion nuggets             cake                1

しかし、「baby one more time」が「britney spears」に関連付けられているとは言えないのと同様に、「open book」が「ファッション ナゲット」や「ケーキ」と関係があるとは言い切れません。カウントを一致させようとすることもできますが、最終的にはこのような結果になります

title                  album                       artist              count
baby one more time     hit me baby one more time   britney spears      9
null                   fashion nuggets             cake                3
the distance           null                        null                1
open book,daria        null                        null                1

このような列を持つテーブルが必要だったと思います

title                  album                         artist
baby one more          hit me baby one more time     britney spears
baby one more          hit me baby one more time     britney spears
baby one more          hit me baby one more time     britney spears
baby one more          hit me baby one more time     britney spears
baby one more          hit me baby one more time     britney spears
baby one more          hit me baby one more time     britney spears
baby one more          hit me baby one more time     britney spears
baby one more          hit me baby one more time     britney spears
baby one more          hit me baby one more time     britney spears
the distance           fashion nuggets               cake
the distance           fashion nuggets               cake
open book              fashion nuggets               cake
daria                  fashion nuggets               cake

しかし、おそらくアーティストやアルバムでパーティション化されています。パーティション化の有無にかかわらず、テーブルがパーティション化されていないかのようにクエリを記述できます (データが破損していない限り、結果には影響せず、パフォーマンスのみが影響します)。ただし、テーブルを作成してデータを入力する方法に影響します。これがあなたが望んでいたものかどうか教えてください。代わりに、この回答を編集してその質問に回答します。


約束どおりの編集:

さて、パーティションなしでテーブルを作成するのは簡単です:

CREATE TABLE results (title string, album string, artist string)

パーティションを使用してテーブルを作成するのはほぼ簡単です。最初に何をパーティション化するかを決める必要があるだけです。アーティストでパーティション分割すると、他のアーティストの情報を処理することなく、単一または一連のアーティストに固有のクエリを実行できることを意味します。アーティストとアルバムで分割すると、アルバムでも同じことができます。これには、大きなファイルを小さなファイルに分割するという代償が伴います。一般に、MapReduce (したがって Hive) は大きなファイルでより適切に機能します。少なくとも数十 GB を処理し、パーティショニングの仕組みと HiveQL 全般を理解していない限り、パーティショニングについてはまったく心配しません。ただし、完全を期すために、アーティストによるパーティション分割:

CREATE TABLE results (title string, album string) PARTITIONED BY (artist string);

アーティストごと、次にアルバムごとに分割されます。(artist string, album string)vsで分割し(album string, artist string)ても結果は変わりませんが、階層の論理的な最上位を最初に配置する必要があります。

CREATE TABLE (title string) PARTITIONED BY (artist string, album string);

titles, artists, and albumsタイトル、アーティスト、アルバムの膨大なリストがあるため、アクセスできる情報がテーブルからのものだけである場合、このテーブルにデータを入力するのは簡単ではありません。これらの関係が損なわれていない、またはデータ セットが損なわれていないデータがあることを願っています。この架空のデータの形式を知らなければ、テーブルにデータを入力する方法について答えを出すことはできません。ただし、パーティション分割されたテーブルがある場合、すべてのアーティストとアルバムを手動で指定したくない場合は、この回答が役立つ場合があります (すべてのアーティストが独自のパーティションを取得し、パーティション内ですべてのアルバムが独自のパーティションを取得するため)。

編集: アスカーには、タイトル、アブラム、アリストの関係が損なわれていない xml ファイルがあります。詳細については、コメントをご覧ください。

問題の要点は、一意のタプルを数えることです。これは、データがどのように分割されたかに関係なく同じです。GROUP BY句を使用してこれを行います。1 つの列 (またはパーティション。特別なプロパティを持つ列と見なすことができます) を指定すると、データはその列の個別の値を持つグループに分割されます。複数の列を指定すると、列の組み合わせに個別の値を持つグループにデータが分割されます。これは、個別のタプルをカウントするために利用するものです:

SELECT title, album, artist, COUNT(*)
FROM results
GROUP BY title, album, artist

そして、ここにいます:

title                  album                       artist              count
baby one more time     hit me baby one mroe time   britney spears      9
the distance           fashion nuggets             cake                2
open book              fashion nuggets             cake                1
daria                  fashion nuggets             cake                1
于 2013-03-21T20:27:39.620 に答える