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

Posted

技术标签:

【中文标题】“连续字段的容器格式”对文件格式意味着啥?【英文标题】:What does "the container format for fields in a row" mean for a file format?“连续字段的容器格式”对文件格式意味着什么? 【发布时间】:2019-05-14 20:00:40 【问题描述】:

来自 Hadoop:权威指南

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

行格式规定行的方式,以及 特定行中的字段被存储。在 Hive 用语中,行 格式由 SerDe 定义,这是一个组合词 串行器-解串器。当充当解串器时,即 查询表的情况下,SerDe 将反序列化一行数据 从文件中的字节到 Hive 内部使用的对象 对该行数据进行操作。当用作串行器时,它是 执行 INSERT 或 CTAS 时的情况(请参阅第 500),表的 SerDe 将序列化 Hive 的内部表示 将一行数据转换为写入输出文件的字节。

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

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

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

【问题讨论】:

【参考方案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

File Format 表示文件容器,它可以是文本或二进制格式,如 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 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 class (extends FileOutputFormat) 和JsonSerDe (implements SerDe) 您可以深入挖掘并尝试了解实现的方法和基类/接口,查看源代码,序列化和反序列化@987654325 中的方法@。

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

【讨论】:

以上是关于“连续字段的容器格式”对文件格式意味着啥?的主要内容,如果未能解决你的问题,请参考以下文章

JPG、GIF、PNG和BMP格式的图片各有啥优点和缺点?

MP4播放器支持啥格式的视频文件?

视频都是啥格式?

音乐文件dff是啥格式?

css文件用啥软件打开 后缀名css是啥格式文件

zip.dl是啥格式