DESCRIBE EXTENDED view_logs;## 存储格式
Hive从两个维度对表的存储进行管理: row format 和 file format。 row format 指 行和一行中的字段如何存储。对于Hive来说,row format的定义由SerDe定义。
查询表时,SerDe 把文件中字节形式的数据行反序列化为Hive内部操作数据行时所使用的对象形式。执行Insert 或者CTAS 时,表的SerDe会把Hive的数据行内部表示形式序列化成字节形式并写到输出文件中。
file format 指一行中字段容器的格式。最简单的格式是纯文本文件。
文本存储
如果在创建表时没有用ROW FORMAT 或者 STORED AS,那么Hive 默认使用 文本格式存储。每行存储一个数据行,默认的行内分隔符不是制表符,是Ctrl-A(ASCII 码为1)。集合元素默认的分隔符未字符Ctrl-B,用于分割 ARRAY或STRUCT或MAP的键值对中的元素。
Hive默认使用8级分隔符。
CREATE TABLE ...
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\001'
COLLECTION ITEMS TERMINATED BY '\002'
MAP KEYS TERMINATED BY '\003'
LINES TERMINATED BY '\n'
STORED AS TEXTFILE;
Hive内部使用一个名未LazySimpleSerDe的SerDe来处理这种分割符。
代码片段:
public static SerDeParameters initSerdeParams(Configuration job,
Properties tbl, String serdeName) throws SerDeException {
SerDeParameters serdeParams = new SerDeParameters();
// Read the separators: We use 8 levels of separators by default,
// and 24 if SERIALIZATION_EXTEND_NESTING_LEVELS is set to true
// The levels possible are the set of control chars that we can use as
// special delimiters, ie they should absent in the data or escaped.
// To increase this level further, we need to stop relying
// on single control chars delimiters
serdeParams.separators = new byte[8];
serdeParams.separators[0] = getByte(tbl.getProperty(serdeConstants.FIELD_DELIM,
tbl.getProperty(serdeConstants.SERIALIZATION_FORMAT)), DefaultSeparators[0]);
serdeParams.separators[1] = getByte(tbl
.getProperty(serdeConstants.COLLECTION_DELIM), DefaultSeparators[1]);
serdeParams.separators[2] = getByte(
tbl.getProperty(serdeConstants.MAPKEY_DELIM), DefaultSeparators[2]);
String extendedNesting =
tbl.getProperty(SERIALIZATION_EXTEND_NESTING_LEVELS);
if(extendedNesting == null || !extendedNesting.equalsIgnoreCase("true")){
//use the default smaller set of separators for backward compatibility
for (int i = 3; i < serdeParams.separators.length; i++) {
serdeParams