MultiDelimitSerde 是否支持 NULL DEFINED AS 子句?

Does the MultiDelimitSerde support NULL DEFINED AS clause?

article 表明我们可以在 Hive 中使用多字符定界符。

但是我们也可以指定 NULL 值吗?

我尝试了以下配置单元 sql,其中 returns 出错:

CREATE TABLE temp
( a STRING, b STRING)
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe'
WITH SERDEPROPERTIES ("field.delim"="@#")
NULL DEFINED AS 'NULL'
STORED AS TEXTFILE;

错误:

Error: Error while compiling statement: FAILED: ParseException line 5:0 missing EOF at 'NULL' near ')' (state=42000,code=40000)

当我们使用 ROW FORMAT DELIMITED 选项时,使用 NULL DEFINED AS 'NULL' 的选项可用。这里我们使用了 ROW FORMAT SERDE 选项,因此我们需要显式传递 属性 serialization.null.format

您可以通过设置 serialization.null.format 的 属性 值来使用以下查询:

CREATE TABLE temp
( a STRING, b STRING)
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe'
WITH SERDEPROPERTIES ("field.delim"="@#",'serialization.null.format'='NULL')
STORED AS TEXTFILE;

有关详细信息,您可以参考 Hive DDL reference guide. MultiDelimitSerde 源代码。

HIVE DDL GUIDE:

row_format
  : DELIMITED [FIELDS TERMINATED BY char [ESCAPED BY char]] [COLLECTION ITEMS TERMINATED BY char]
        [MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char]
        [NULL DEFINED AS char]   -- (Note: Available in Hive 0.13 and later)
  | SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, property_name=property_value, ...)]