我有一个外部配置单元表,该表指向带有JSON文件的目录,该目录包含多个JSON文档。我正在尝试在Zeppelin笔记本中创建Hive SQL语句以从该文件读取并插入内部ORC表中。我的查询没有任何联接或侧面视图,只是直接选择;
%jdbc(hive)
add jar /usr/hdp/current/hive-client/lib/json-serde-1.3.8-jar-with-dependencies.jar;
-- Load the ORC Internal Table
insert overwrite
table rapidengage.it_engagement_selectedvalues
select et_engagement_selectedvalues.parentpath as `_id`,et_engagement_selectedvalues.splitpath.clientTypeSelection,et_engagement_selectedvalues.splitpath.createdNewEcUrl,et_engagement_selectedvalues.splitpath.eafTemplateSelection,et_engagement_selectedvalues.splitpath.gfsidSelection,et_engagement_selectedvalues.splitpath.territorySelection
from rapidengage.et_engagement_selectedvalues
这继续引发非常冗长的错误,但是当我深入研究该错误时,似乎可执行的错误消息如下;
原因:org.apache.hadoop.hive.serde2.SerDeException:java.io.IOException:预期字段名称
我尝试将以下属性添加到我的外部表中,这由SO上的其他线程建议,这些线程在搜索上述错误消息时作为结果返回;
'serialization.last.column.takes.rest'='true'
如果我只尝试运行select并注释掉插入内容,则它在齐柏林飞艇中成功,但是我认为这是一种幻想。 Zeppelin UI对其在结果中显示的内容有限制,因此我怀疑它仅获取前N条记录,如果未遇到错误,那么一切都很好。此外,当我尝试从外部表中读取内容,但将下面查询中的每个字段都重写为硬编码字符串时,尝试插入仍然会遇到相同的错误。因此,我相信问题出在读而不是写。
我在这里真的很茫然……我认为我唯一的“线索”是,在该JSON文件中的所有JSON文档中,我可以看到在一个路径上存在不同的结构。在外部表的splitpath字段中,我看到一些文档,其架构如下;
struct<
clientTypeSelection:string,createdNewEcUrl:boolean,eafTemplateSelection:string,eafTemplates:array<string>,gfsidSelection:array<string>,prodCodeSelection:array<
struct<
productLineId:string,productCode:string
>
>,territorySelection:string,taxPcsOrPFSForAFS:string
>
...然后我看到其他文档,其架构如下;
struct<
clientTypeSelection:string,pcsOrpfs:struct<pcsOrPfsCompleted:boolean>,prodCodeSelection:array<string>,territorySelection:string>
>
我知道并不是每个JSON文档都具有相同的字段,因此我们尝试确保获得一个完整的JSON文件,从中可以推断Hive的架构。但是,当我查看 prodCodeSelection 时,我看到它具有简单的字符串数组或复杂的对象数组,我不禁怀疑这是问题所在吗?我一直在使用包含该字段对象数组的架构,因此我的想法是“找不到字段”是指对象数组中字段的名称吗?当它遇到其中一个只是字符串数组的文档之一时,显然没有获取字段,这就是错误吗?