Hive學習小記-(4)帶復雜集合類型及指定多分隔符hive建表


帶集合類型建表

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’into table 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.字段解釋說明 
(1CREATE TABLE 創建一個指定名字的表。如果相同名字的表已經存在,則拋出異常;用戶可以用 IF NOT EXISTS 選項來忽略這個異常。
(2)EXTERNAL關鍵字可以讓用戶創建一個外部表,在建表的同時可以指定一個指向實際數據的路徑(LOCATION),在刪除表的時候,內部表的元數據和數據會被一起刪除,而外部表只刪除元數據,不刪除數據。
(3)COMMENT:為表和列添加注釋。
(4)PARTITIONED BY創建分區表
(5CLUSTERED 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上的存儲位置。
(10AS:后跟查詢語句,根據查詢結果創建表。
(11)LIKE允許用戶復制現有的表結構,但是不復制數據

 

TIPS:字符的ascii碼

字符常量可以是普通字符‘a’,'b'這樣,也可以是轉義字符\t,\n這種

這些字符也都可以用ASCII碼表示,即用反斜符(\)開頭,后跟字符的ASCII碼,這種方法也稱為轉義序列表示法,具體方法有兩種形式:

一種是用字符的八進制ASCII碼,表示為:\0dd.這里,0dd是八進制值(0可以省略)。

另一種使用字符的十六進制ASCII碼值,表示為 \xhh或Xhh 這里hh是兩位十六進制值。

如:'A' ,'\101' 和 '\x41'都表示同一個字符常量。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM