2016-05-13 5 views
4

ハイブの複雑な列にインデックスを作成することは可能です。マップ、構造体、配列などのように複合体。複雑な列にハイブインデックスを作成する

例:

CREATE TABLE employees (
    name   STRING, 
    salary  FLOAT, 
    subordinates ARRAY<STRING>, 
    deductions MAP<STRING, FLOAT>, 
    address  STRUCT<street:STRING, city:STRING, state:STRING, zip:INT> 
) 
PARTITIONED BY (country STRING, state STRING); 

次は動作していないよう:

FAILED
CREATE INDEX employees_index 
ON TABLE employees (address.street) 
AS 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler' 
WITH DEFERRED REBUILD; 

:はParseExceptionライン2時28分、不一致入力 ''インデックス作成文の 'アドレス'の近くにあります。

答えて

2

複雑なデータ型の要素のインデックスを作成することはできません。 ハイブは複合データ型の要素に別の列を提供せず、索引付けは表の列でのみ可能です。 下記をより明確に理解してください。

ハイブインデックスの目標は、テーブルの特定の列のクエリルックアップの速度を向上させることです。索引がないと、 'WHERE tab1.col1 = 10'のような述部を持つ照会は、表またはパーティション全体をロードし、すべての行を処理します。しかし、col1のインデックスが存在する場合は、ファイルの一部のみをロードして処理する必要があります。 索引が提供できる照会速度の向上は、索引および索引を保管するためのディスク・スペースを作成するための追加の処理を必要とします。続き

は、複雑なデータ型に

CREATE INDEX employees_index 
ON TABLE employees (address) 
AS ‘org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler’ 
WITH DEFERRED REBUILD 
IN TABLE employees_index_table 
PARTITIONED BY (country,name) 
COMMENT ‘index based on complex column’; 

をインデックスを作成するための正しい方法は、このプログラムが動作する方法を理解 は、我々は次のクエリを記述すると仮定し、このパン屋で

select * from employees where address.street='baker'; 

ことができますです住所(複合型STRUCT)
(例:ストリート: 'ベイカー'、都市: 'ロンドン'、州: 'XYZ'、ジップ:84902)

上記の例では、クエリはテーブル全体をロードするのではなく、インデックステーブルのaddress.street = 'baker'を検索します。

ありがとうございます。

1

インデックスは、列の要素にない列に対してのみ作成できます。あなたの与えられた試料台アドレス

https://cwiki.apache.org/confluence/display/Hive/IndexDev

列で、address.streetは、その列の要素です。アドレスの

指数は可能..です

関連する問題