Hive SerDe initialize()函数调用了8次

时间:2018-09-06 18:14:43

标签: apache hadoop hive cloudera-cdh hive-serde

我正在编写一个自定义的Hive SerDe,它可以读取存储为ORC的数据。

基础表包含一个event_map列MAP。 SerDe会从event_map列中读取数据,并在进行一些其他处理后将其分解为单独的列。例如:地图应为{'key1':'val1','key2':'val2'}。

然后,我将创建一个外部表,例如:

ADD JAR hdfs:///user/my-serde.jar;
CREATE EXTERNAL TABLE IF NOT EXISTS dev_db.expand_data_using_serde (
  key1        STRING,
  key2        STRING
) PARTITIONED BY (
  ds          STRING
)
ROW FORMAT SERDE 'com.....MySerDeClass'
WITH SERDEPROPERTIES (
  "key1" = "extract_json",
  "key2" = "multiply_by_5"
)
STORED AS ORC
LOCATION 'hdfs://dev.db/underlying_table_stored_as_orc';

USE dev_db;
MSCK REPAIR TABLE expand_data_using_serde;

然后,SerDe将找到“ key1”和“ key2”列,并将其从基础映射中提取出来,并将它们公开为单独的列而不是MAP。我知道我们可以通过配置单元查询来展开本专栏,但是为了简单起见,请提供此示例。即,SerDe将检查表DDL是否将key1作为列,并从event_map中提取key1并将其用于该列。

大多数处理都在serde的deserialize()函数中。但是,我注意到我的initialize()方法被调用了8次。

那是为什么?反序列化每行调用一次,这很有意义,但是初始化被重复调用。

SerDe还可以通过“ columns”属性访问输出表模式,它也可以访问查询吗?

例如:如果我的查询是

SELECT key1 FROM dev_db.expand_data_using_serde;

SERDE能知道我们只需要读取key1并跳过对key2的处理吗?

谢谢!

0 个答案:

没有答案