配置单元创建表错误

9wbgstp7  于 2021-06-04  发布在  Hadoop
关注(0)|答案(1)|浏览(356)

我正尝试使用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

很明显,这个错误是由于列名中的空格造成的,但是原始数据是以这种形式出现的,我不想执行预处理步骤来删除空格。
有什么建议吗?

bprjcwpo

bprjcwpo1#

如果您不想维持预处理阶段(我假设在暂存表中加载原始文本,然后将其转换为上下文中的预处理),对我来说,最直接的选择是扩展serde,以便在反序列化期间将空格替换为下划线,以便匹配配置单元列/结构字段名定义。从我看到的源代码(我假设您使用的是这个serde)来看 put 方法 JSONObject 对象类可以被重写,以便 key 参数在插入到基础贴图对象之前进行转换。
如果您愿意接受使用staging表的方法,您可以随时加载原始文本并使用 get_json_object 提取您需要的内容,因为在hive的json路径中,空格是非常好的。例如:

get_json_object(raw_text, "$.Vendor ID")

相关问题