hadoop - “连续字段的容器格式”对文件格式意味着什么?
问题描述
来自Hadoop:权威指南:
Hive 中有两个维度控制表存储:行格式和文件格式。
行格式规定了行和特定行中的字段的存储方式。在 Hive 用语中,行格式由 SerDe 定义,Serializer-Deserializer 的组合词。当充当反序列化器时(查询表时就是这种情况),SerDe 会将文件中的字节中的一行数据反序列化为 Hive 内部使用的对象,以对该行数据进行操作。当用作序列化器时,执行 INSERT 或 CTAS(请参阅第 500 页的“导入数据”)时,表的 SerDe 会将 Hive 的一行数据的内部表示序列化为写入输出文件的字节.
文件格式规定了连续字段的容器格式。最简单的格式是纯文本文件,但也有面向行和面向列的二进制格式。
“连续字段的容器格式”对文件格式意味着什么?
文件格式与行格式有何不同?
解决方案
另请阅读有关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,但在这种情况下将忽略行格式分隔。
推荐阅读
- iis - # IIS 文件路径中的符号
- c# - 数字前的 OrderBy 自定义比较器特定字母
- java - 如何在 InternalResourceViewResolver Spring MVC 中配置多个文件夹?
- tensorflow - 即使在训练后量化之后,“模型未量化”
- c++ - linux上的CMake FindJNI问题
- python - 如何正确使用 tft.compute_and_apply_vocabulary 和 tft.tfidf?
- python - 在递归查找最大路径和时,附加二叉树的左或右方向
- batch-file - 提取子字符串并在一行中对批处理文件变量应用字符串替换
- python-3.x - 如何使用 WMI 从 python 中的远程计算机检索文件
- c# - 如何在 C# 中将 int 值转换为 hh:mm?