来自Hadoop权威指南
Hive中有两个维度控制表存储:行 格式和文件格式。
行格式规定了行的方式以及 存储特定行中的字段。用Hive的话来说, 格式由SerDe定义,SerDe是一个 序列化器/反序列化器。充当解串器时, 查询表的情况下,SerDe将反序列化一行数据 从文件中的字节到Hive内部使用的对象 对那一行数据进行操作。当用作序列化程序时 执行INSERT或CTAS的情况(请参阅第31页的“导入数据”) 500),表格的SerDe将序列化Hive的内部表示形式 将一行数据写入写入输出文件的字节中。
文件格式规定了行中各个字段的容器格式。的 最简单的格式是纯文本文件,但是有面向行和 面向列的二进制格式也可用。
“行字段的容器格式”对文件格式意味着什么?
文件格式与行格式有何不同?
谢谢。
答案 0 :(得分:1)
还请阅读有关 SerDe
的指南Hive使用SerDe(和FileFormat)读取和写入表行。
HDFS files --> InputFileFormat --> <key, value> --> Deserializer --> Row object
Row object --> Serializer --> <key, value> --> OutputFileFormat --> HDFS files
您可以使用自定义SerDe或本机SerDe创建表。如果未指定ROW FORMAT或指定ROW FORMAT DELIMITED,则使用本机SerDe
文件格式表示文件容器,可以是文本格式或二进制格式,例如ORC或Parquet。
行格式可以是简单的定界文本,也可以是复杂的regexp/template-based或JSON。
考虑文本文件中JSON格式的记录:
ROW FORMAT SERDE
'org.apache.hive.hcatalog.data.JsonSerDe'
STORED AS TEXTFILE
或序列文件中的JSON记录:
ROW FORMAT SERDE
'org.apache.hive.hcatalog.data.JsonSerDe'
STORED AS SEQUENCEFILE
一切实际上都是Java类。对于初学者来说,非常令人困惑的是DDL中可能存在快捷方式,这使您可以编写DDL而无需为所有格式指定长而复杂的类名。有些类在DDL语言中没有嵌入相应的快捷方式。
存储为序列文件是
的快捷方式STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.SequenceFileInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.mapred.SequenceFileOutputFormat'
这两个类确定如何读取/写入文件容器。
并且此类确定应如何存储和读取行(JSON):
ROW FORMAT SERDE
'org.apache.hive.hcatalog.data.JsonSerDe'
现在DDL具有行格式和文件格式,而没有快捷方式:
ROW FORMAT SERDE
'org.apache.hive.hcatalog.data.JsonSerDe'
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.SequenceFileInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.mapred.SequenceFileOutputFormat'
为了更好地理解它们之间的区别,请查看SequenceFileOutputFormat class (extends FileOutputFormat) 和JsonSerDe (implements SerDe),您可以深入研究并尝试了解实现的方法和基类/接口,查看源代码,进行序列化和反序列化JsonSerDe class中的方法。
“行中字段的容器格式”是上述DDL中提到的FileInputFormat加上FileOutputFormat。例如,对于ORC file,您不能指定行格式(带分隔符或其他SerDe)。 ORC文件指示OrcSerDe仅用于这种类型的文件容器,该文件容器具有用于存储行和列的自身内部格式。实际上,您可以在Hive中编写ROW FORMAT DELIMITED STORED AS ORC,但是在这种情况下,行格式定界将被忽略。