Hive學習小記-(4)帶複雜集合型別及指定多分隔符hive建表
阿新 • • 發佈:2020-12-26
帶集合型別建表
Hive上建立測試表test
create table test( name string, friends array<string>, children map<string, int>, address struct<street:string, city:string> ) row format delimited fields terminated by ',' collection items terminated by '_' map keys terminated by ':' lines terminated by '\n';
-- 其中 row format delimited fields terminated by ',' -- 列分隔符欄位解釋: collection items terminated by '_' --MAP STRUCT 和 ARRAY 的分隔符(資料分割符號) map keys terminated by ':' -- MAP中的key與value的分隔符 lines terminated by '\n'; -- 行分隔符
# 從本地上傳檔案 hive (default)> load data local inpath ‘/opt/module/datas/test.txt’intotable test
-- 三種集合型別的資料,以下分別是ARRAY,MAP,STRUCT的訪問方式 hive (default)> select friends[1],children['xiao song'],address.city from test where name="songsong"; OK _c0 _c1 city lili 18 beijing Time taken: 0.076 seconds, Fetched: 1 row(s)
多分隔符建表
create table test_toutiao(
id string
,tag1 int
,tag2 string
,question string
,answer string
) ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe'
WITH SERDEPROPERTIES ("field.delim"="_!_");
-- 這裡WITH SERDEPROPERTIES 裡面是不是少了一個encoding='UTF-8'或者'GBK'之類的引數?
-- field.delim也可以寫八進位制ascii碼,vim資料檔案在NORMAL格式下輸入ga可以檢視ascii碼,eg:"field.delim"="\124\028"
附:hive建表規則
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] [TBLPROPERTIES (property_name=property_value, ...)] [AS select_statement] 2.欄位解釋說明 (1)CREATE TABLE 建立一個指定名字的表。如果相同名字的表已經存在,則丟擲異常;使用者可以用 IF NOT EXISTS 選項來忽略這個異常。 (2)EXTERNAL關鍵字可以讓使用者建立一個外部表,在建表的同時可以指定一個指向實際資料的路徑(LOCATION),在刪除表的時候,內部表的元資料和資料會被一起刪除,而外部表只刪除元資料,不刪除資料。 (3)COMMENT:為表和列添加註釋。 (4)PARTITIONED BY建立分割槽表 (5)CLUSTERED BY建立分桶表 (6)SORTED BY不常用,對桶中的一個或多個列另外排序 (7)ROW FORMAT DELIMITED [FIELDS TERMINATED BY char] [COLLECTION ITEMS TERMINATED BY char] [MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char] | SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, property_name=property_value, ...)] 使用者在建表的時候可以自定義SerDe或者使用自帶的SerDe。如果沒有指定ROW FORMAT 或者ROW FORMAT DELIMITED,將會使用自帶的SerDe。在建表的時候,使用者還需要為表指定列,使用者在指定表的列的同時也會指定自定義的SerDe,Hive通過SerDe確定表的具體的列的資料。 SerDe是Serialize/Deserilize的簡稱, hive使用Serde進行行物件的序列與反序列化。 (8)STORED AS指定儲存檔案型別 常用的儲存檔案型別:SEQUENCEFILE(二進位制序列檔案)、TEXTFILE(文字)、RCFILE(列式儲存格式檔案) 如果檔案資料是純文字,可以使用STORED AS TEXTFILE。如果資料需要壓縮,使用 STORED AS SEQUENCEFILE。 (9)LOCATION :指定表在HDFS上的儲存位置。 (10)AS:後跟查詢語句,根據查詢結果建立表。 (11)LIKE允許使用者複製現有的表結構,但是不復制資料
TIPS:字元的ascii碼
字元常量可以是普通字元‘a’,'b'這樣,也可以是轉義字元\t,\n這種
這些字元也都可以用ASCII碼錶示,即用反斜符(\)開頭,後跟字元的ASCII碼,這種方法也稱為轉義序列表示法,具體方法有兩種形式:
一種是用字元的八進位制ASCII碼,表示為:\0dd.這裡,0dd是八進位制值(0可以省略)。
另一種使用字元的十六進位制ASCII碼值,表示為 \xhh或Xhh 這裡hh是兩位十六進位制值。
如:'A' ,'\101' 和 '\x41'都表示同一個字元常量。