查询表时,SerDe 会将文件中的字节中的一行数据反序列化为 Hive 内部使用的对象,以对该行数据进行操作。在执行 INSERT 或 CTAS(请参阅第 441 页的“导入数据”)时,表的 SerDe 会将Hive 的一行数据的内部表示序列化为写入输出文件的字节。
- 是 serDe 库吗?
- 蜂巢如何存储数据,即它存储在文件或表中?
- 请任何人都可以清楚地解释粗体句子吗?我是新来的蜂巢!
答案
有关如何编写 SerDe 的更多信息,请阅读这篇文章
在这方面,我们可以将 Hive 视为某种数据库引擎。该引擎正在处理由记录构建的表。
当我们让 Hive(以及任何其他数据库)以自己的内部格式工作时 - 我们不在乎。
当我们希望 Hive 将我们自己的文件作为表(外部表)处理时,我们必须让他知道 - 如何将文件中的数据转换为记录。这正是 SerDe 的作用。您可以将其视为使 Hive 能够读取/写入数据的插件。
例如 - 您想使用 CSV。这是 CSV_Serde 的示例
https://github.com/ogrodnek/csv-serde/blob/master/src/main/java/com/bizo/hive/serde/csv/CSVSerde.java
方法序列化将读取数据,并且假设它是 CSV,将其切成字段
方法反序列化将获取一条记录并将其格式化为 CSV。
Hive 也可以通过使用 (1) 复杂数据类型(struct,array,unions) (2) 通过使用 SerDe 来分析半结构化和非结构化数据
SerDe 接口允许我们指示 hive 应该如何处理记录。Serializer 将获取 hive 一直在处理的 java 对象,并将其转换为 hive 可以存储的东西,而 Deserializer 将记录的二进制表示形式转换为 hive 可以操作的 java 对象。
我认为上面有序列化和反序列化的概念。序列化在写入时完成,结构化数据被序列化为位/字节流进行存储。读取时,数据从位/字节存储格式反序列化为读取器所需的结构。例如,Hive 需要看起来像行和列的结构,但 hdfs 将数据存储在位/字节块中,因此在写入时序列化,在读取时反序列化。