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

ecfsfe2w  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(381)

来自hadoop:权威指南:
有两个维度控制配置单元中的表存储:行格式和文件格式。
行格式指定如何存储行以及特定行中的字段。在配置单元中,行格式由serde定义,serde是序列化程序反序列化程序的portmanteau字。当充当反序列化程序(查询表时就是这种情况)时,serde会将一行数据从文件中的字节反序列化为配置单元内部用于对该行数据进行操作的对象。当用作序列化程序时,即执行插入或CTA时(请参阅第500页的“导入数据”),表的serde会将配置单元对一行数据的内部表示形式序列化为写入输出文件的字节。
文件格式指定行中字段的容器格式。最简单的格式是纯文本文件,但也有面向行和面向列的二进制格式。
“行中字段的容器格式”对于文件格式意味着什么?
文件格式与行格式有何不同?

2uluyalo

2uluyalo1#

请阅读有关serde的指南
hive使用serde(和fileformat)读取和写入表行。

HDFS files --> InputFileFormat --> <key, value> --> Deserializer --> Row object
Row object --> Serializer --> <key, value> --> OutputFileFormat --> HDFS files

可以使用自定义serde或使用本机serde创建表。如果未指定行格式或指定了行格式分隔符,则使用本机serde
文件格式表示文件容器,它可以是文本或二进制格式,如orc或parquet。
行格式可以是简单的分隔文本,也可以是相当复杂的基于regexp/template或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语言中没有相应的快捷方式。
存储为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 file指定orcserde只用于这种类型的文件容器,它有自己的内部格式来存储行和列。实际上,您可以在配置单元中写入存储为orc的行格式分隔符,但在这种情况下,将忽略行格式分隔符。

相关问题