?Hive目前支持的數(shù)據(jù)格式包括Text File框沟、SequenceFile飞涂、RCFile、Avro、ORC 和Parquet咙轩,同時可以自定義INPUTFORMAT和OUTPUTFORMAT來支持其他格式殴泰。
https://cwiki.apache.org/confluence/display/Hive/FileFormats
?具體到某種數(shù)據(jù)格式巧还,Hive是如何進(jìn)行支持的呢穗泵?主要涉及INPUTFORMAT/OUTPUTFORMAT、SerDe分片(Split)和記錄(Record)等概念盗尸。
?具體來說柑船,分片被劃分為若干個記錄;每條記錄就是一個鍵值對泼各,對應(yīng)一行鞍时。InputFormat將輸入文件生成分片,并將分片分割成記錄扣蜻。SerDe是SerializerDeserializer的縮寫逆巍。以Hive讀取HDFS文件為例,會有以下處理:
1)調(diào)用InputFormat莽使,將文件生成分片并分割成記錄锐极;
2)調(diào)用SerDe的Deserializer,將一行(Row)芳肌,切分為各個字段灵再。
?Hive向HDFS寫入文件時,順序相反亿笤。大體流程如下所示:
HDFS files --> InputFileFormat --> Deserializer --> Row object --> Serializer --> OutputFileFormat --> HDFS files
1翎迁、INPUTFORMAT/OUTPUTFORMAT
通常,Hive中的建表語句如下:
CREATE TABLE my_table(a string, b string, ...)
COMMENT 'This is the page view table'
PARTITIONED BY(dt STRING, country STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\001'
WITH SERDEPROPERTIES (
"separatorChar" = "\t",
"quoteChar" = "'",
"escapeChar" = "\\"
)
STORED AS TEXTFILE;
?INPUTFORMAT/OUTPUTFORMAT對應(yīng)創(chuàng)建表時的STORED AS語句净薛,如果自定義編寫的INPUTFORMAT/OUTPUTFORMAT汪榔,在創(chuàng)建表時可以寫成STORED AS INPUTFORMAT '<packagepath.classname>' OUTPUTFORMAT '<packagepath.classname>' 的形式。
?Hive中支持的format參照https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-StorageFormats
2罕拂、SerDes
?官方wikihttps://cwiki.apache.org/confluence/display/Hive/SerDe
?TEXTFILE格式使用默認(rèn)的SerDe,LazySimpleSerDe全陨。
?Hive中支持的SerDe參照https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-RowFormats&SerDe
?總結(jié):Metastore對文件格式的支持基于以上概念和原理爆班,如果有自定義格式的需求(以JSON為例),無論基于現(xiàn)有的開源方案辱姨,還是自定義編寫柿菩,都是可以的。