“连续字段的容器格式”对文件格式意味着什么?

时间:2019-05-14 20:00:41

标签: hadoop hive

来自Hadoop权威指南

  

Hive中有两个维度控制表存储:行   格式和文件格式。

     

行格式规定了行的方式以及   存储特定行中的字段。用Hive的话来说,   格式由SerDe定义,SerDe是一个   序列化器/反序列化器。充当解串器时,   查询表的情况下,SerDe将反序列化一行数据   从文件中的字节到Hive内部使用的对象   对那一行数据进行操作。当用作序列化程序时   执行INSERT或CTAS的情况(请参阅第31页的“导入数据”)   500),表格的SerDe将序列化Hive的内部表示形式   将一行数据写入写入输出文件的字节中。

     

文件格式规定了行中各个字段的容器格式。的   最简单的格式是纯文本文件,但是有面向行和   面向列的二进制格式也可用。

“行字段的容器格式”对文件格式意味着什么?

文件格式与行格式有何不同?

谢谢。

1 个答案:

答案 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中提到的F​​ileInputFormat加上FileOutputFormat。例如,对于ORC file,您不能指定行格式(带分隔符或其他SerDe)。 ORC文件指示OrcSerDe仅用于这种类型的文件容器,该文件容器具有用于存储行和列的自身内部格式。实际上,您可以在Hive中编写ROW FORMAT DELIMITED STORED AS ORC,但是在这种情况下,行格式定界将被忽略。