hiveでのquery外部テーブルの簡単なテスト

3699 ワード

まず、Hiveの2つの異なるテーブルについて説明します.
Managed Tables Managed tables or sometimes called internal tables, because Hive controls the lifecycle of their data (more or less). As we’ve seen, Hive stores the data for these tables in a subdirectory under the directory defined by hive.metastore.warehouse.dir (e.g.,/user/hive/warehouse), by default. When we drop a managed table, Hive deletes the data in the table.  However, managed tables are less convenient for sharing with other tools. For example, suppose we have data that is created and used primarily by Pig or other tools, but we want to run some queries against it, but not give Hive ownership of the data. We can define an external table that points to that data, but doesn’t take ownership of it.
次の簡単な文は、内部テーブルを作成します.
hive> create table x (a int);
External Tables
外部テーブルを作成する例を次に示します.
hive> CREATE EXTERNAL TABLE IF NOT EXISTS stocks ( exchange STRING, symbol STRING, ymd STRING, price_open FLOAT, price_high FLOAT, price_low FLOAT, price_close FLOAT, volume INT, price_adj_close FLOAT) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION '/data/stocks';
hiveの場合、外部テーブルのデータにはownerではなく「使用権」しかありません.クラスタの場合、hadoop、pigなどの複数のプログラムでデータが使用される可能性があるからです.したがってhiveはownこれらのデータを持つべきではない場合があります.上記の文から、外部テーブルを作成しながらデータの場所を指定し、managed tableを作成するときにデータを指定する必要はありません.したがって、内部テーブルでは、queryデータを取得するには、次のようにする必要があります.
1,テーブルのschemaを作成する
2、hiveにデータをインポートします.
外部テーブルでは、テーブルschemaを作成するだけでqueryデータが作成され、データをインポートする必要はありません.
内部テーブルはlocationパラメータを指定することもできますが、hiveが外部テーブルを作成するときのlocationとは異なる場所にデータを保存することを意味します.また、hadoopがstandaloneモードで動作している場合、locationはローカルディレクトリであってもよいことに注意してください.擬似分散モードまたは分散モードで動作する場合、locationはHDFSディレクトリである必要があります.HDFSはファイルシステムとしてBlockに格納されているものが何であるかに関心を持っていないため、Blockのデータには異なる組織形式(file format)があることに注意してください.最新バージョンのHiveでは、次のfile formatがサポートされています.
txt, Avro, Parguet, RCFile, ORCFile, Sequence file, LZO-compressed txt
たとえば、次の例では、RCFile形式でデータを格納し、lzo圧縮アルゴリズムを使用することを指定する内部テーブルを作成します.RCFileは行列混合ストレージフォーマットで、具体的には自分で資料を調べます.
-- Prepare
CREATE TABLE rc_lzo (
    client BIGINT, ctime INT, mtime INT,
    code STRING, value_1 INT, value_2 INT
) STORED AS RCFILE;
-- Compression
SET hive.exec.compress.output=true;
SET mapred.output.compression.codec=com.hadoop.compression.lzo.LzoCodec;
-- Import
INSERT OVERWRITE TABLE rc_lzo
SELECT * FROM (
    SELECT
        client, round(ctime / 1000), round(mtime / 1000),
        code, value_1, value_2
    FROM staging
) T;

他のHiveがデフォルトでサポートしていないfile formatの場合、HiveはSerDeインタフェースを提供し、ユーザーはデータシーケンス化と逆シーケンス化プログラムをカスタマイズすることができます.Hiveは、ユーザーがカスタマイズしたプログラムを自動的に呼び出し、これらのデータを使用します.
異なるfile formatを使用すると、異なる圧縮アルゴリズムを使用して、ストレージ効率を向上させることができます.また、アプリケーション自体が使用している場合や、データソースが何らかの特殊なデータである場合、データがHiveに入ると変換する必要がなく、直接使用することができます.
テストプロセス
開始前にhadoopとhiveがインストールされていることを確認する必要があります.hive shellでshow tablesを実行できます.hiveが正常に動作するかどうかを確認します.
1、まずcsvファイルをテストするために準備します.このcsvファイルをlinuxのディレクトリの下に配置します.
2.hadoopがstandaloneモードで動作している場合は、このステップをスキップしてtableを直接作成できます.擬似分散モードまたは分散モードで動作する場合は、csvをhdfsにコピーして使用する必要があります.
$ hadoop fs -put/home/DBA/TestData/*.csv/user/hadoop/input--inputはhadoopのデフォルトのinputディレクトリであり、hdfsであれば別のディレクトリを使用することもできます.
$hadoop fs-ls/user/hadoop/input--ファイルが準備されていることを確認します.
3,tableの作成
CREATE EXTERNAL TABLE IF NOT EXISTS backupStatus1 ( ServerName STRING, DatabaseName STRING, LastBackedUpDate TIMESTAMP, LastBackupStatus STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION '/user/hadoop/input';
4、それからqueryができます.
select * from backupStatus1 where servername like 'SomeBox'; 上記の2つのステップは、HIVE shellでコマンドを実行します.