“连续字段的容器格式”对文件格式意味着啥?
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,但是这种情况下会忽略行格式分隔。
【讨论】:
以上是关于“连续字段的容器格式”对文件格式意味着啥?的主要内容,如果未能解决你的问题,请参考以下文章