hive serde initialize()函数调用了8次

lrpiutwd  于 2021-05-29  发布在  Hadoop
关注(0)|答案(0)|浏览(195)

我正在写一个定制的Hive服务器,可以读取orc存储的数据。
基础表包含一个事件Map列Map。serde从event\ u map列读取数据,并在一些额外的处理之后将它们分解成单独的列。例如: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中提取它们,并将它们作为单独的列而不是Map公开。我知道我们可以通过一个配置单元查询来分解这个列,但是为了简单起见,我们提供了这个示例。i、 serde将检查表ddl是否有key1作为列,并将从事件Map中提取key1并将其用于该列。
大多数处理都在serde的反序列化()函数中。但是,我注意到initialize()方法被调用了8次。
为什么?反序列化是每行调用一次,这是有意义的,但初始化是重复调用。
另外,serde可以通过“columns”属性访问输出表模式,它也可以访问查询吗?
如果我的问题是

SELECT key1 FROM dev_db.expand_data_using_serde;

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

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题