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

Hadoop 调用了8次Hive SerDe initialize()函数,hadoop,hive,cloudera-cdh,hive-serde,Hadoop,Hive,Cloudera Cdh,Hive Serde,我正在编写一个定制的蜂巢服务器,可以读取存储为ORC的数据 基础表包含一个事件映射列映射。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

我正在编写一个定制的蜂巢服务器,可以读取存储为ORC的数据

基础表包含一个事件映射列映射。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”列,并从基础映射中提取它们,并将它们作为单独的列而不是映射公开。我知道我们可以通过一个配置单元查询来分解这个列,但为了简单起见,提供了这个示例。i、 e.SerDe将检查表DDL是否将key1作为列,并将从事件映射中提取key1并将其用于该列

大部分处理在serde的反序列化()函数中。但是,我注意到initialize()方法被调用了8次

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

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

如果我的问题是

SELECT key1 FROM dev_db.expand_data_using_serde;

serde能知道我们只需要读取键1并跳过对键2的处理吗?

它能在每个映射器中运行吗,总共8个映射器它总是初始化8次,而不管映射器的数量如何。首先我想可能
设置hive.exec.parallel.thread.number
是原因,但我增加了并行线程数-仍然调用了8次。如果您有8个分区,并且
MSCK REPAIR
调用会为每个隐式
添加分区触发SerDe…
调用?只需将1个分区作为测试表,而且-所有命令上的
INITIALIZE
都会调用8次,
MSCK修复
选择*
选择*。。LIMI 100