我有一个巨大的数据集,其中的每条记录都具有类似于下面的json数据-
{“ project”:{“ id”:“ 2625”,“ createDate”:1542597000000,“ rank”:0,“ highlight”:false,“ isDisplay”:true,“ isNewProject”:true,“ propertyId” :2231,“ districts”:{“ id”:41,“ name”:“ abc”,“ region”:“ 123”}}}
当我尝试在apache演练中使用select kvgen(t.project) from dfs.filePath t
生成键值对时,出现错误-
DrillRuntimeException:Mappify / kvgen不支持异构值类型。输入映射中的所有值都必须是同一类型。字段[createDate]具有不同的类型[minor_type:BIGINT模式:可选]
看来,drill期望所有值都属于同一类型。但是该怎么做呢?钻中有任何可用功能吗?
我的钻取版本是1.9.0
答案 0 :(得分:1)
尝试将会话选项destruct a
设置为true。
答案 1 :(得分:1)
我知道了。如果json是嵌套的,则KVGEN方法不起作用。 要使其正常运行,可以遵循两种方法-
{“ project”:{“ id”:“ 2625”,“ createDate”:1542597000000,“ rank”:0,“ highlight”:false,“ isDisplay”:true,“ isNewProject”:true,“ propertyId” :2231},“地区”:{“ id”:41,“名称”:“ abc”,“区域”:“ 123”}}
,然后将KVGEN方法应用为select kvgen(t.project) from dfs.filePath t
首先在内部json上应用kvgen方法,然后使用嵌套查询,如下所示
select tbl2.col1.id, tbl2.col2.value from (select tbl1.project as col1, flatten(kvgen(tbl1.project.districts)) col2 from dfs.filePath tbl1) tbl2
正如@ arina-yelchiyeva正确提到的那样,会话选项store.json.all_text_mode
需要设置为true。