我正在编写一个自定义的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的处理吗?
谢谢!