Hiveの——操作語句の整理

8490 ワード

転載は出典を明記してください。http://blog.csdn.net/l1028386804/article/details/78291025
ハ作成表人情報表  person(String name,int age)
 hive> create table person(name STRING,age INT)ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' ESCAPED BY '\\' STORED AS TEXTFILE;
 OK
 Time taken: 0.541 seconds
氢作成表のチケット価格情報表 ticket(int age,float price)
 hive> create table ticket(age INT,price FLOAT)ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' ESCAPED BY '\\' STORED AS TEXTFILE;
 OK
 Time taken: 0.154 seconds
氢はローカルデータファイルを作成します。
 -rw-rw-r-- 1 hadoop hadoop  40 Feb  6 13:28 person.txt
 -rw-rw-r-- 1 hadoop hadoop  45 Feb  6 13:28 ticket.txt
氢はローカルのデータファイルをhiveデータストアにロードします。
 hive> LOAD DATA LOCAL INPATH '/home/hadoop/hfxdoc/person.txt' OVERWRITE INTO TABLE person;
 Copying data from file:/home/hadoop/hfxdoc/person.txt
 Copying file: file:/home/hadoop/hfxdoc/person.txt
 Loading data to table default.person
 Deleted hdfs://10.15.107.155:8000/user/hive/warehouse/person
 OK
 Time taken: 0.419 seconds
 hive> LOAD DATA LOCAL INPATH '/home/hadoop/hfxdoc/ticket.txt' OVERWRITE INTO TABLE ticket;
 Copying data from file:/home/hadoop/hfxdoc/ticket.txt
 Copying file: file:/home/hadoop/hfxdoc/ticket.txt
 Loading data to table default.ticket
 Deleted hdfs://10.15.107.155:8000/user/hive/warehouse/ticket
 OK
 Time taken: 0.25 seconds
菘loadコマンドは、データファイルを配置されたデータ経路に移動します。/user/hive/warehouse
 hive> show tables;
 hive> describe person
 hive> select * from person;
 OK
 huang   26
 lili    25
 dongdong        13
 wangxiao        5
 Time taken: 0.092 seconds
 hive> 
〓〓〓文はMapReduceプログラムにコンパイルされないので、とても速いです。
ちょっと複雑なjoinで調べます。
hive> select * from person join ticket on person.age = ticket.age;
 MapReduce Total cumulative CPU time: 5 seconds 510 msec
 Ended Job = job_201301211420_0011
 MapReduce Jobs Launched:
 Job 0: Map: 2  Reduce: 1   Cumulative CPU: 5.51 sec   HDFS Read: 519 HDFS Write: 71 SUCCESS
 Total MapReduce CPU Time Spent: 5 seconds 510 msec
 OK
 wangxiao        5       5       10.0
 dongdong        13      13      20.0
 lili    25      25      30.0
 huang   26      26      30.0
 Time taken: 32.465 seconds
 #ここで検索文をMapReduceプログラムにコンパイルし、hadoopで実行します。
同前は外部表を採用する
xingはまずローカルファイルputからhdfsファイルへの経路下で
 [hadoop@localhost hfxdoc]$ hadoop fs -mkdir /tmp/ticket
 [hadoop@localhost hfxdoc]$ hadoop fs -put person.txt /tmp/ticket
 [hadoop@localhost hfxdoc]$ hadoop fs -put ticket.txt /tmp/ticket         
 [hadoop@localhost hfxdoc]$ hadoop fs -ls /tmp/ticket
 Found 2 items
 -rw-r--r--   1 hadoop supergroup         40 2013-02-06 13:45 /tmp/ticket/person.txt
 -rw-r--r--   1 hadoop supergroup         45 2013-02-06 13:45 /tmp/ticket/ticket.txt
create external table person_ext(name STRING,age INT)ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' ESCAPED BY '\\' STORED AS TEXTFILE LOCATION '/tmp/ticket'
㌦LOCATIONはデータパスのみ設定できますが、先ほど私達のパスの下に二つのテーブルのファイルがありますか?このように作成した表の一つがいいですか?
同前
いけませんしたがって、ファイルパスの下のすべてのファイルは、このデータテーブルに関連するデータファイルであるべきです。
他のテーブルのファイルがある場合、この作成プロセスはエラーを報告しません。例えばもう一つの書類は一行三列です。それでは三列目です。
癜はpersonテーブルでは解析できません。一列に一列しかないなら、二列目はNULLで補完されます。だから私たちはhdfsファイルのパスを調整します。
hive> select * from person_ext;
 OK
 huang   26
 lili    25
 dongdong        13
 wangxiao        5
 1       10
 2       10
 5       10
 13      20
 14      20
 25      30
 26      30
 31      40
 Time taken: 0.088 seconds
 hive> drop table person_ext;
菗Drop外観の操作は元情報が考えたデータを削除しないので、hdfsにはまだデータファイルがあります。
複雑なタイプのデータテーブルは、ここで列間を'\t'で分割し、配列要素間を'、'で分割します。
 #データファイルの内容は以下の通りです。
 1 huangfengxiao   beijing,shanghai,tianjin,hangzhou
 2 linan   changchu,chengdu,wuhan
 
 hive> create table complex(name string,work_locations array)
     > ROW FORMAT DELIMITED
     > FIELDS TERMINATED BY '\t'
     > COLLECTION ITEMS TERMINATED BY ',';

 hive> describe complex;
 OK
 name    string
 work_locations  array

 hive> LOAD DATA LOCAL INPATH '/home/hadoop/hfxdoc/complex.txt' OVERWRITE INTO TABLE complex
 hive> select * from complex;                                                               
 OK
 huangfengxiao   ["beijing","shanghai","tianjin","hangzhou"]
 linan   ["changchu","chengdu","wuhan"]
 Time taken: 0.125 seconds

 hive> select name, work_locations[0] from complex;
 MapReduce Total cumulative CPU time: 790 msec
 Ended Job = job_201301211420_0012
 MapReduce Jobs Launched:
 Job 0: Map: 1   Cumulative CPU: 0.79 sec   HDFS Read: 296 HDFS Write: 37 SUCCESS
 Total MapReduce CPU Time Spent: 790 msec
 OK
 huangfengxiao   beijing
 linan   changchu
 Time taken: 20.703 seconds
どのように区分しますか
 表class(teacher sting、student string、age int)
 Mis li huangfengxiao 20
 Mis li lijie 21
 Mis li dongdong 21
 Mis li liqiang 21
 Mis li hemeng 21
 Mr xu dingding 19
 Mr xu wangqiang 19
 Mr xu lidong 19
 Mr xu hexing 19
このクラスのメンバーのデータをteacherによって分けます。
 create table classmem(student string,age int) partitioned by(teacher string)
パーティションファイル
classmem_Misli.txt
  huangfengxiao 20 
  lijie 21         
  dongdong 21 
  liqiang 21         
  hemeng 21
 classmem_MrXu.txt
  dingding 19
  wangqiang 19
  lidong 19        
  hexing 19  
 LOAD DATA LOCAL INPATH '/home/hadoop/hfxdoc/classmem_Misli.txt' INTO TABLE classmem partition (teacher = 'Mis.li')
 LOAD DATA LOCAL INPATH '/home/hadoop/hfxdoc/classmem_MrXu.txt' INTO TABLE classmem partition (teacher = 'Mis.Xu')
 #パーティションの列はデフォルトで最後の列になります。
hive> select * from classmem where teacher = 'Mr.Xu';
 OK
 dingding        19      NULL    Mr.Xu
 wangqiang       19      NULL    Mr.Xu
 lidong  19              NULL    Mr.Xu
 hexing  19      NULL    Mr.Xu
 Time taken: 0.196 seconds
〓〓〓は直接パーティションから検索して、加速します。もしwhere子文の条件がパーティション列ではないなら、このsqlはmapreduceプログラムにコンパイルされて、遅延が大きいです。
したがって、我々はいくつかのよく使われているクエリフィールドをフィルタするためにパーティションを設定します。
〓〓桶の使用?もっと効率的に!サンプリング可能!主に大データセットのサンプリングに使われます。
 バケットの原理は一つのテーブル(またはパーティション)をスライスし、スライスされたフィールドを選択し、バケットの個数を設定し、フィールドと個数のhash値でバケットに入れることです。
 例えば、buckett.txtデータファイルの内容は以下の通りです。
id name age
 1 huang 11
 2 li 11
 3 xu 12
 4 zhong 14
 5 hu 15
 6 liqiang 17
 7 zhonghua 19
このデータテーブルを3つの桶に切りたいなら、スライスフィールドはidです。
 idフィールドでshした後、3つのバケツの内容は以下の通りです。
 桶id hash 3=0
 3 xu 12
 6 liqiang 17
 桶id hash 3=1
 1 huang 11
 4 zhhong 14
 7 zhhonghu a 19
 桶id hash 3=2
 2 li。 11
 5 hu。 15
 このプロセスの作成文は以下の通りです。
create table bucketmem (id int,name string,age int) CLUSTERED BY (id) sorted by (id asc) into 3 buckets
 ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';

 LOAD DATA LOCAL INPATH '/home/hadoop/hfxdoc/bucketmem.txt' INTO TABLE bucketmem;
 select * from bucketmem tablesample(bucket 1 out of 4)
〓〓その他の操作の参考、更に完備しているのは公式サイトを参照してください:https://cwiki.apache.org/confluence/display/Hive/Home
 1)既知のテーブルと同じ構造のテーブルLikeを作成する:
 テーブルの構造だけをコピーして、テーブルの内容をコピーしません。
create table test_like_table like test_bucket;
 2)表をリネームするレムト:
 ALTER TABLE table_name RENAME TO new_table_name
 3)パーティションを追加するAdd Parttions:
ALTER TABLE table_name ADD partition_spec [ LOCATION 'location1' ]partition_spec [ LOCATION 'location2' ]
4)列の名前/列を含むテーブルの列の位置/列のコメントを修正します。
ALTER TABLEテーブルname CHANGE[COLUMN]col_old_name colnew_name columntype[COMMENT col comment][FIRST 124; AFTER columnuname]
5)追加/置換列Add/ReplacceColumns
ALTER TABLE table_name ADD|REPLACE COLUMNS (col_name data_type [COMMENTcol_comment], ...)
ADD COLUMNSは、ユーザが現在の列の末尾に新しい列を追加することを可能にするが、パーティション列の前に。
6)表の完全な語句を作成します。
Create [EXTERNAL] TABLE [IF NOT EXISTS] table_name
 [(col_name data_type [COMMENT col_comment], ...)]
 [COMMENT table_comment]
 [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]
 [CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name [ASC|DESC], ...)]INTO num_buckets BUCKETS]
 [ROW FORMAT row_format]
 [STORED AS file_format]
 [LOCATION hdfs_path]
 7)hiveでhdfsファイルを確認する
 >dfs -ls /user;