新增一列並增加列欄位註釋

weixin_30639719發表於2020-04-05

  HIVE是什麼

  來自度娘百科的解釋:hive是基於Hadoop的一個資料倉儲工具,可以將結構化的資料檔案對映為一張資料庫表,並提供完整的sql查詢功能,可以將sql語句轉換為MapReduce任務進行執行。 其優點是學習成本低,可以通過類SQL語句快速實現簡單的MapReduce統計,不必開發專門的MapReduce應用,十分適合資料倉儲的統計分析。

  簡單來說,就是用QL這種語言的方式來完成MapReduce程式的工作,由於大多數程式設計師都會寫基於關係型資料庫的SQL,那麼HIVE的出現也就將Hadoop上的開發降低了很多門檻。

  Hive常見的引數

  io.sort.mb設定資料緩衝區的小大

  HIVE基礎語句

  建立表

  Hive的表,與普通關係型資料庫,如mysql在表上有很大的區別,所有hive的表都是一個檔案,它是基於Hadoop的檔案系統來做的。

  hive總體來說可以總結為三種不同型別的表。

  1. 普通表

  普通表的建立,如上所說,不講了。其中,一個表,就對應一個表名對應的檔案。

  2. 外部表

  EXTERNAL 關鍵字可以讓使用者建立一個外部表,在建表的同時指定一個指向實際資料的路徑(LOCATION),Hive 建立內部表時,會將資料移動到資料倉儲指向的路徑;若建立外部表,僅記錄資料所在的路徑,不對資料的位置做任何改變。在刪除表的時候,內部表的後設資料和資料會被一起刪除,而外部表只刪除後設資料,不刪除資料。具體sql如下:

  Java程式碼

收藏程式碼

  CREATE EXTERNAL TABLE test_1(id INT, name STRING, city STRING) SORTED BY TEXTFILE ROW FORMAT DELIMITED‘\t’ LOCATION ‘hdfs://../../..’

  3. 分割槽表

  有分割槽的表可以在建立的時候使用 PARTITIONED BY 語句。一個表可以擁有一個或者多個分割槽,每一個分割槽單獨存在一個目錄下。而且,表和分割槽都可以對某個列進行 CLUSTERED BY 操作,將若干個列放入一個桶(bucket)中。也可以利用SORT BY 對資料進行排序。這樣可以為特定應用提高效能。具體SQL如下:

  Java程式碼

收藏程式碼

  CREATE TABLE test_1(id INT, name STRING, city STRING) PARTITIONED BY (pt STRING) SORTED BY TEXTFILE ROW FORMAT DELIMITED‘\t’

  Hive的排序,因為底層實現的關係,比較不同於普通排序,這裡先不講。桶的概念,主要是為效能考慮,可以理解為對分割槽內列,進行再次劃分,提高效能。在底層,一個桶其實是一個檔案。如果桶劃分過多,會導致檔案數量暴增,一旦達到系統檔案數量的上限,就杯具了。哪種是最優數量,這個哥也不知道。

  分割槽表實際是一個資料夾,表名即資料夾名。每個分割槽,實際是表名這個資料夾下面的不同檔案。分割槽可以根據時間、地點等等進行劃分。比如,每天一個分割槽,等於每天存每天的資料;或者每個城市,存放每個城市的資料。每次查詢資料的時候,只要寫下類似 where pt=2010_08_23這樣的條件即可查詢指定時間得資料。

  總體而言,普通表,類似mysql的表結構,外部表的意義更多是指資料的路徑對映。分割槽表,是最難以理解,也是最hive最大的優勢。之後會專門針對分割槽表進行講解。

  建表語句如下:

  Java程式碼

收藏程式碼

  hive> CREATE TABLE pokes (foo INT, bar STRING);

  實際示例

  建立一個表

  Java程式碼

收藏程式碼

  CREATE TABLE u_data (

  userid INT,

  movieid INT,

  rating INT,

  unixtime STRING)

  ROW FORMAT DELIMITED

  FIELDS TERMINATED BY '\t'

  STORED AS TEXTFILE;

  其中,hive支援的欄位型別,並不多,可以簡單的理解為數字型別和字串型別,詳細列表如下:

  TINYINT

  SMALLINT

  INT

  BIGINT

  BOOLEAN

  FLOAT

  DOUBLE

  STRING

  建立表並建立索引欄位ds

  Java程式碼

收藏程式碼

  hive> CREATE TABLE invites (foo INT, bar STRING) PARTITIONED BY (ds STRING);

  顯示所有表

  Java程式碼

收藏程式碼

  hive> SHOW TABLES;

  按正條件(正規表示式)顯示錶,

  Java程式碼

收藏程式碼

  hive> SHOW TABLES '.*s';

  表新增一列

  Java程式碼

收藏程式碼

  hive> ALTER TABLE pokes ADD COLUMNS (new_col INT);

  新增一列並增加列欄位註釋

  Java程式碼

收藏程式碼

  hive> ALTER TABLE invites ADD COLUMNS (new_col2 INT COMMENT 'a comment');

  更改表名

  Java程式碼

收藏程式碼

  hive> ALTER TABLE events RENAME TO 3koobecaf;

  刪除列

  Java程式碼

收藏程式碼

  hive> DROP TABLE pokes;

  後設資料儲存

  Hive不支援一條一條的用insert語句進行插入操作,也不支援update的操作。資料是以load的方式,載入到建立好的表中。資料一旦匯入,則不可修改。要麼drop掉整個表,要麼建立新的表,匯入新的資料。

  將檔案中的資料載入到表中

  Java程式碼

收藏程式碼

  hive> LOAD DATA LOCAL INPATH './examples/files/kv1.txt' OVERWRITE INTO TABLE pokes;

  載入本地資料,同時給定分割槽資訊

  Java程式碼

收藏程式碼

  hive> LOAD DATA LOCAL INPATH './examples/files/kv2.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-15');

  載入DFS資料 ,同時給定分割槽資訊

  Java程式碼

收藏程式碼

  hive> LOAD DATA INPATH '/user/myname/kv2.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-15');

  The above command will load data from an HDFS file/directory to the table. Note that loading data from HDFS will result in moving the file/directory. As a result, the operation is almost instantaneous.

  INSERT+SELECT

  Standard syntax:

  INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1 FROM from_statement

  Hive extension (multiple inserts):

  FROM from_statement

  INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1

  [INSERT OVERWRITE TABLE tablename2 [PARTITION ...] select_statement2] ...

  Hive extension (dynamic partition inserts):

  INSERT OVERWRITE TABLE tablename PARTITION (partcol1[=val1], partcol2[=val2] ...) select_statement FROM from_statement

  這個的用法,和上面兩種直接瀋陽最好的男科醫院操作file的方式,截然不同。排開分割槽

  SQL 操作

  按先件查詢

  hive> SELECT a.foo FROM invites a WHERE a.ds='';

  將查詢資料輸出至目錄

  hive> INSERT OVERWRITE DIRECTORY '/tmp/hdfs_out' SELECT a.* FROM invites a WHERE a.ds='';

  將查詢結果輸出至本地目錄

  hive> INSERT OVERWRITE LOCAL DIRECTORY '/tmp/local_out' SELECT a.* FROM pokes a;

  選擇所有列到本地目錄

  hive> INSERT OVERWRITE TABLE events SELECT a.* FROM profiles a;

  hive> INSERT OVERWRITE TABLE events SELECT a.* FROM profiles a WHERE a.key < 100;

  hive> INSERT OVERWRITE LOCAL DIRECTORY '/tmp/reg_3' SELECT a.* FROM events a;

  hive> INSERT OVERWRITE DIRECTORY '/tmp/reg_4' select a.invites, a.pokes FROM profiles a;

  hive> INSERT OVERWRITE DIRECTORY '/tmp/reg_5' SELECT COUNT(1) FROM invites a WHERE a.ds='';

  hive> INSERT OVERWRITE DIRECTORY '/tmp/reg_5' SELECT a.foo, a.bar FROM invites a;

  hive> INSERT OVERWRITE LOCAL DIRECTORY '/tmp/sum' SELECT SUM(a.pc) FROM pc1 a;

  將一個表的統計結果插入另一個表中

  hive> FROM invites a INSERT OVERWRITE TABLE events SELECT a.bar, count(1) WHERE a.foo > 0 GROUP BY a.bar;

  hive> INSERT OVERWRITE TABLE events SELECT a.bar, count(1) FROM invites a WHERE a.foo > 0 GROUP BY a.bar;

  JOIN

  hive> FROM pokes t1 JOIN invites t2 ON (t1.bar = t2.bar) INSERT OVERWRITE TABLE events SELECT t1.bar, t1.foo, t2.foo;

  將多表資料插入到同一表中

  FROM src

  INSERT OVERWRITE TABLE dest1 SELECT src.* WHERE src.key < 100

  INSERT OVERWRITE TABLE dest2 SELECT src.key, src.value WHERE src.key >= 100 and src.key < 200

  INSERT OVERWRITE TABLE dest3 PARTITION(ds='2008-04-08', hr='12') SELECT src.key WHERE src.key >= 200 and src.key < 300

  INSERT OVERWRITE LOCAL DIRECTORY '/tmp/dest4.out' SELECT src.value WHERE src.key >= 300;

  將檔案流直接插入檔案

  Java程式碼

收藏程式碼

  hive> FROM invites a INSERT OVERWRITE TABLE events SELECT TRANSFORM(a.foo, a.bar) AS (oof, rab) USING '/bin/cat' WHERE a.ds > '2008-08-09';

  This streams the data in the map phase through the script /bin/cat (like hadoop streaming). Similarly - streaming can be used on the reduce side (please see the Hive Tutorial or examples)

  下載示例資料檔案,並解壓縮

  wget http://www.grouplens.org/system/files/ml-data.tar__0.gz

  tar xvzf ml-data.tar__0.gz

  載入資料到表中

  Java程式碼

收藏程式碼

  LOAD DATA LOCAL INPATH 'ml-data/u.data'

  OVERWRITE INTO TABLE u_data;

  統計資料總量

  Java程式碼

收藏程式碼

  SELECT COUNT(1) FROM u_data;

  現在做一些複雜的資料分析

  建立一個 weekday_mapper.py: 檔案,作為資料按周進行分割

  import sys

  import datetime

  for line in sys.stdin:

  line = line.strip()

  userid, movieid, rating, unixtime = line.split('\t')

  生成資料的周資訊

  weekday = datetime.datetime.fromtimestamp(float(unixtime)).isoweekday()

  print '\t'.join([userid, movieid, rating, str(weekday)])

  使用對映指令碼

  //建立表,按分割符分割行中的欄位值

  CREATE TABLE u_data_new (

  userid INT,

  movieid INT,

  rating INT,

  weekday INT)

  ROW FORMAT DELIMITED

  FIELDS TERMINATED BY '\t';

  //將python檔案載入到系統

  add FILE weekday_mapper.py;

  將資料按周進行分割

  INSERT OVERWRITE TABLE u_data_new

  SELECT

  TRANSFORM (userid, movieid, rating, unixtime)

  USING 'python weekday_mapper.py'

  AS (userid, movieid, rating, weekday)

  FROM u_data;  www-463nanren-com

  

轉載於:https://www.cnblogs.com/shenyang463/p/3644863.html

相關文章