更新时间:2022-11-08 来源:黑马程序员 浏览量:
Serde是Serializer and Deserializer(序列化和反序列化)的简称,Hive 通过Serde处理Hive数据表中每一行数据的读取和写入,例如查询Hive数据表数据时,HDFS中存放的数据表数据会通过Serializer序列化为字节流便于数据传输;向Hive数据表插入数据时,会通过Deserializer将数据反序列化成Hive数据表的每一行值,方便将数据加载到数据表中,不需要对数据进行转换。
Hive的Serde分为自定义 Serde和内置Serde,其中使用自定义 Serde 时需要在CREATE TABLE句式中指定ROW FORMAT子句的 row_format值为 Serde,并根据Serde类型指定实现类;内置 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; | 使用正则表达式序列化/反序列 化数据表的每一行数据,其中 regex用于指定正则表达式 | ||
ROW FORMAT SERDE 'org.apache.hive.heatalog.data.JsonSerDe STORED AS TEXTFILE | 使用JSON格式序列化/反序列 化数据表的每一行数据 | ||
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格式序列化/反序列化数据表的每一行数据,其中separatorChar用于指定CSV 文件的分隔符:quoteChar用于指定CSV文件的应用符;escapeChar用于指定CSV文件的转义符 | ||
表2 常用的内置Serde
内置Serde | 介绍 | ||
FIELDS TERMINATED BY char [ESCAPED BY char] | FIELDS TERMINATED指定字段分隔符:ESCAPED指定转义符,避免数据中存在与字段分隔符一样的字符,造成混淆 | ||
COLLECTION ITEMS TERMINATED BY char | 使用JSON格式序列化/反序列 化数据表的每一行数据 | ||
MAP KYS TERMINATED BY char | 指定MAP中Key和Value 的分隔符 | ||
LINES TERMINATED BY char | 指定行分隔符 | ||
NULL. DEFINED AS char | 自定义空值格式dive默认为'\N' | ||
通过CREATETABLE句式创建数据表时可以使用TBLPROPERTIES子句指定表属性,Hive表属性分为自定义属性和预定义属性,其中使用自定义属性时,用户可以自定义属性名称(property_name)和属性值(property_value),用于为创建的数据表指定自定义标签,例如指定创建表的作者、创建表的时间等;使用预定义属性时,需要根据Hive规定的属性名称和属性值使用,用于为创建的数据表指定相关配置,有关Hive预定义属性如表3所示。
图3 Hive预定义属性
属性 | 值 | 描述 | ||
comment | table_comment | 表描述 | ||
hbase,table,name | table_name | 集成HBase | ||
immutable | true 或 false | 防止意外更新,若为true,则无法通过lnsert实现数据的更新和插入 | ||
orc,compress | ZLIB 或 SNAPPY或 NONE | 指定ORC压缩方式 | ||
transactional | true 或 false | 指定表是否支持ACID(更新、插入、删除) | ||
NO_AUTO_COMPACTION | true 或 false | 表事务属性,指定表是否支持自动紧缩 | ||
compactor.mapreduce.map.memory.mb | mapper_memory | 表事务属性,指定紧缩map(内存/MB)作业的属性 | ||
compactorthreshold.hive .compactor,delta,num,threshold | threshold_num | 表事务属性,如果有超过threshold_num 个 增量目录,则触发轻度紧缩 | ||
compactorthreshold.hive .compactor,delta,num,threshold | threshold_pet | 表事务属性,如果增量文件的大小与基础文 件的大小比率大于threshold_pet(区间为 0~1).则触发深度紧缩 | ||
auto.purge | true 或 false | 若为trae,则删除或者覆盖的数据会不经过 回收站直接被删除 | ||
EXTERNAL | true 或 false | 内部表和外部表的转换 | ||