我正尝试使用jsonserde创建一个配置单元表,其结构如下:
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
很明显,这个错误是由于列名中的空格造成的,但是原始数据是以这种形式出现的,我不想执行预处理步骤来删除空格。
有什么建议吗?
1条答案
按热度按时间bprjcwpo1#
如果您不想维持预处理阶段(我假设在暂存表中加载原始文本,然后将其转换为上下文中的预处理),对我来说,最直接的选择是扩展serde,以便在反序列化期间将空格替换为下划线,以便匹配配置单元列/结构字段名定义。从我看到的源代码(我假设您使用的是这个serde)来看
put
方法JSONObject
对象类可以被重写,以便key
参数在插入到基础贴图对象之前进行转换。如果您愿意接受使用staging表的方法,您可以随时加载原始文本并使用
get_json_object
提取您需要的内容,因为在hive的json路径中,空格是非常好的。例如: