2017-01-25 9 views
1

次のコマンドとavroスキーマを使用してハイブテーブルを作成しました。.avroファイルからハイブテーブルにデータをインポート

CREATE TABLE table_name 
PARTITIONED BY (t string, y string, m string, d string, h string, hh string) 
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.avro.AvroSerDe' 
STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat' 
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat' 
TBLPROPERTIES (
'avro.schema.url'='hdfs://location/schema.avsc'); 

私はHDFSで作成したデータを作成したテーブルにダンプします。

私はt/y/m/d/h/hh/data.avroディレクトリ構造のデータを持っているHDFSの場所を持っています 私はパーティションに応じて複数のディレクトリを持っています。

作成したテーブルにすべてのデータをダンプします。

外部テーブルを使用しようとしましたが、例外が発生しています。

答えて

2

hdfsフォルダー内のハイブ規則に従い、テーブルの場所を示すハイブテーブルを作成する場合は、msck repair tableステートメントを実行する必要があります。例えば

CREATE TABLE table_name 
PARTITIONED BY (t string, y string, m string, d string, h string, hh string) 
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.avro.AvroSerDe' 
STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat' 
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat' 
TBLPROPERTIES (
'avro.schema.url'='hdfs://location/schema/schema.avsc') 
location "hdfs:///location/data; 

/location/data/y=2016/m=02/d=03/h=03/hh=12/data.avroようなデータをロードします /location/data/y = 2016/m = 02/d = 03/h = 03/hh = 13/data2。その方法で、アブロ

あなたは次のような追加のパーティションを使用することができ、あなたがこれを行うにはしたくない場合はハイブは、パーティション

msck repair table table_name; 

を認識するため、次の文でデータをロードすることができるようになります

ALTER TABLE table_nameADD PARTITION (y='01',m='02',d='03',h='03',hh='12') location '/yourpath/y=2016/m=02/d=03/h=03/hh=12/'; (or any other folder) 
1

LOCATION 'path_hdfs'コマンドを外部テーブルの作成のクエリ中に挿入するか、またはLOAD DATA LOCAL INPATH 'path_hdfs' OVERWRITE INTO TABLE table_name;物理テーブルを使用してコマンドを挿入できます。

UPDATE:OPで尋ねたよう

、私はパーティショニングについての詳細情報を追加します。クエリの作成中にコマンドPARTITIONED BY (day string)(datatype 'string'の 'day'変数の例)を指定する必要があります。完全な例については、湖の回答を参照してください。

  • 日= 2017年11月2日
  • 日= 2017年11月3日
  • 日= 2017年11月4日
  • :次に、作成上のデータは、すでに「日」の値を次のようしている場合

コマンドMSCK REPAIR TABLE <table>を実行すると、これら3つの値のパーティションが追加されます。

  • 日= 2017年11月5日
:次の日、あなたは MSCK REPAIR TABLE <table>を実行すると、2017年11月5日=あなたが一日のために、データを受け取ると仮定し、新たな価値のために新しいパーティションを追加されます

物理的には、パーティションを追加すると、HDFS上の異なるフォルダにデータが整理されます。パーティションを作成するには、データに対する書き込み権限が必要です。しかし既にパーティションがある場合は、フォルダシステムに "day = 2017-11-02"の形式で名前が付けられたフォルダがあることを確認してください。このように、MSCK REPAIRコマンドを実行すると、パーティションはメタデータとして自動的にロードされます。私はいつも外付けテーブルで作業していましたが、私はこのパイプラインを使いました。

+0

私はディスクへの書き込み権限がないため、外部テーブルの作成でLOCATION 'path_hdfs'を使用することはできません。 – KrunalParmar

+0

LOAD DATAコマンドを使用しているときに、次の例外が発生しています,,, FAIRED:SemanticException [エラー10062]:宛先テーブルが分割されているためにパーティション列を指定する必要があります。 – KrunalParmar

+0

作成クエリ中にパーティションを宣言してから、新しいデータをインポートした後(パーティション側に新しい値を指定して)、MSCK REPAIR

コマンドを定期的に実行してパーティションを更新する必要があります。たとえば、1日ごとにパーティションを作成する場合、毎日、MSCK REPAIRコマンドを実行して新しい日をパーティションに追加する必要があります。ここで私の答えをパーティション構文で更新します。 –

0

以下の構文が役立ちます。

CREATE EXTERNAL TABLE table_name 
    PARTITIONED BY (part string) 
    ROW FORMAT SERDE 
    'org.apache.hadoop.hive.serde2.avro.AvroSerDe' 
    WITH SERDEPROPERTIES (
    'avro.schema.url'='hdfs:///path/to/avro/schema/') 
    STORED AS INPUTFORMAT 
    'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat' 
    OUTPUTFORMAT 
    'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat' 
    LOCATION 'path/to/location' 

    ALTER TABLE table_name ADD PARTITION (part='part_name') LOCATION 'location' 
関連する問題