我正在尝试使用具有以下结构的JSONSerde创建Hive表:
CREATE TABLE events (
device_uuid string,
uuid string,
custom struct<
"Vendor ID":int,
"Customer ID":int>,
platform string
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
STORED AS TEXTFILE;
我尝试创建表时遇到的问题如下:
Error occurred executing hive query: OK converting to local hdfs://dpcl01:820/user/hive/aux_jars/json-serde-1.3-jar-with-dependencies.jar Added /tmp/523576-5d62-4fff-b737-813aca807eee_resources/json-serde-1.3-jar-with-dependencies.jar to class path Added resource: /tmp/52356576-5d62-4fff-b737-813aca807eee_resources/json-serde-1.3-jar-with-dependencies.jar FAILED: ParseException line 8:2 cannot recognize input near '"Vendor ID"' ':' 'int' in column specification
很明显,这个错误是由列名中的空格引起的,但原始数据是以这种形式出现的,我不想执行预处理步骤来删除空格。
有什么建议吗?
答案 0 :(得分:0)
如果您不想维持预处理阶段(我假设在临时表中加载原始文本然后将其转换为上下文中的预处理),那么最简单的选择对我来说,扩展SerDe以在反序列化期间将空格替换为下划线,以匹配您的Hive列/结构域名称定义。从我所看到的源代码(我假设您正在使用this SerDe),可以覆盖put
对象类的JSONObject
方法,以便所有空白实例在key
参数中,在插入基础地图对象之前进行转换。
如果您 愿意使用登台表来接受该方法,您可以随时加载原始文本并使用get_json_object
来提取您需要的内容,因为空格非常好Hive的JSON路径。例如:
get_json_object(raw_text, "$.Vendor ID")