更新時間:2022-11-08 來源:黑馬程序員 瀏覽量:
Serde是Serializer and Deserializer(序列化和反序列化)的簡稱,Hive 通過Serde處理Hive數(shù)據(jù)表中每一行數(shù)據(jù)的讀取和寫入,例如查詢Hive數(shù)據(jù)表數(shù)據(jù)時,HDFS中存放的數(shù)據(jù)表數(shù)據(jù)會通過Serializer序列化為字節(jié)流便于數(shù)據(jù)傳輸;向Hive數(shù)據(jù)表插入數(shù)據(jù)時,會通過Deserializer將數(shù)據(jù)反序列化成Hive數(shù)據(jù)表的每一行值,方便將數(shù)據(jù)加載到數(shù)據(jù)表中,不需要對數(shù)據(jù)進行轉換。
Hive的Serde分為自定義 Serde和內置Serde,其中使用自定義 Serde 時需要在CREATE TABLE句式中指定ROW FORMAT子句的 row_format值為 Serde,并根據(jù)Serde類型指定實現(xiàn)類;內置 Serde需要在 CREATE TABLE句式中指定 ROW FORMAT子句的row_format值為DELIMITED。Hive中常用的自定義Serde和內置Serde如表1和表2所示。
表1 常用的自定義Serde
自定義Serde | 介紹 | ||
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe' WITH SERDEPROPERTIES ( "input,regex"="regex" ) STORED AS TEXTFILE; | 使用正則表達式序列化/反序列 化數(shù)據(jù)表的每一行數(shù)據(jù),其中 regex用于指定正則表達式 | ||
ROW FORMAT SERDE 'org.apache.hive.heatalog.data.JsonSerDe STORED AS TEXTFILE | 使用JSON格式序列化/反序列 化數(shù)據(jù)表的每一行數(shù)據(jù) | ||
CREATE TABLE my_table(a string, b string, ….) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' WITH SERDEPROPERTIES ( "separatorChar" = "\t", "quoteChar ="'" "escapeChar" ="\\" ) STORED AS TEXTFILE; | 使用CSV格式序列化/反序列化數(shù)據(jù)表的每一行數(shù)據(jù),其中separatorChar用于指定CSV 文件的分隔符:quoteChar用于指定CSV文件的應用符;escapeChar用于指定CSV文件的轉義符 | ||
表2 常用的內置Serde
內置Serde | 介紹 | ||
FIELDS TERMINATED BY char [ESCAPED BY char] | FIELDS TERMINATED指定字段分隔符:ESCAPED指定轉義符,避免數(shù)據(jù)中存在與字段分隔符一樣的字符,造成混淆 | ||
COLLECTION ITEMS TERMINATED BY char | 使用JSON格式序列化/反序列 化數(shù)據(jù)表的每一行數(shù)據(jù) | ||
MAP KYS TERMINATED BY char | 指定MAP中Key和Value 的分隔符 | ||
LINES TERMINATED BY char | 指定行分隔符 | ||
NULL. DEFINED AS char | 自定義空值格式dive默認為'\N' | ||
通過CREATETABLE句式創(chuàng)建數(shù)據(jù)表時可以使用TBLPROPERTIES子句指定表屬性,Hive表屬性分為自定義屬性和預定義屬性,其中使用自定義屬性時,用戶可以自定義屬性名稱(property_name)和屬性值(property_value),用于為創(chuàng)建的數(shù)據(jù)表指定自定義標簽,例如指定創(chuàng)建表的作者、創(chuàng)建表的時間等;使用預定義屬性時,需要根據(jù)Hive規(guī)定的屬性名稱和屬性值使用,用于為創(chuàng)建的數(shù)據(jù)表指定相關配置,有關Hive預定義屬性如表3所示。
圖3 Hive預定義屬性
屬性 | 值 | 描述 | ||
comment | table_comment | 表描述 | ||
hbase,table,name | table_name | 集成HBase | ||
immutable | true 或 false | 防止意外更新,若為true,則無法通過lnsert實現(xiàn)數(shù)據(jù)的更新和插入 | ||
orc,compress | ZLIB 或 SNAPPY或 NONE | 指定ORC壓縮方式 | ||
transactional | true 或 false | 指定表是否支持ACID(更新、插入、刪除) | ||
NO_AUTO_COMPACTION | true 或 false | 表事務屬性,指定表是否支持自動緊縮 | ||
compactor.mapreduce.map.memory.mb | mapper_memory | 表事務屬性,指定緊縮map(內存/MB)作業(yè)的屬性 | ||
compactorthreshold.hive .compactor,delta,num,threshold | threshold_num | 表事務屬性,如果有超過threshold_num 個 增量目錄,則觸發(fā)輕度緊縮 | ||
compactorthreshold.hive .compactor,delta,num,threshold | threshold_pet | 表事務屬性,如果增量文件的大小與基礎文 件的大小比率大于threshold_pet(區(qū)間為 0~1).則觸發(fā)深度緊縮 | ||
auto.purge | true 或 false | 若為trae,則刪除或者覆蓋的數(shù)據(jù)會不經(jīng)過 回收站直接被刪除 | ||
EXTERNAL | true 或 false | 內部表和外部表的轉換 | ||