首页 > 解决方案 > “连续字段的容器格式”对文件格式意味着什么?

问题描述

来自Hadoop:权威指南

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

行格式规定了行和特定行中的字段的存储方式。在 Hive 用语中,行格式由 SerDe 定义,Serializer-Deserializer 的组合词。当充当反序列化器时(查询表时就是这种情况),SerDe 会将文件中的字节中的一行数据反序列化为 Hive 内部使用的对象,以对该行数据进行操作。当用作序列化器时,执行 INSERT 或 CTAS(请参阅第 500 页的“导入数据”)时,表的 SerDe 会将 Hive 的一行数据的内部表示序列化为写入输出文件的字节.

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

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

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

标签: hadoophive

解决方案


另请阅读有关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

File Format 表示文件容器,它可以是文本或二进制格式,如 ORC 或 Parquet。

例如,行格式可以是简单的分隔文本,也可以是相当复杂的基于正则表达式/模板或 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 SEQUENCEFILE

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 类(扩展 FileOutputFormat)JsonSerDe(实现 SerDe)您可以深入挖掘并尝试了解实现的方法和基类/接口,查看源代码,序列化和反序列化方法JsonSerDe 类

而“连续字段的容器格式”是上面 DDL 中提到的 FileInputFormat 加上 FileOutputFormat。例如,对于ORC 文件,您不能指定行格式(分隔或其他 SerDe)。ORC 文件规定 OrcSerDe 将仅用于这种类型的文件容器,它有自己的内部格式来存储行和列。实际上,您可以在 Hive 中编写 ROW FORMAT DELIMITED STORED AS ORC,但在这种情况下将忽略行格式分隔。


推荐阅读