我有一个由json文件构建的外部表。 所有json键都是列,并且按照预期填充,除了一个有空格的键。
这是DDL:
CREATE EXTERNAL TABLE foo.bar
( event ARRAY <STRUCT
value:STRING
,info:STRUCT
<id:STRING
,event_source:STRING>>
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES("mapping.event_source"="event source")
STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION 'foo/bar'
除了event_source(显示为NULL)之外,所有值都按预期显示。 json文件中event_source的原始形式是“event source”,没有单引号。 为了让密钥正常工作,我需要做些与WITH SERDEPROPERTIES设置不同的事情吗?
由于
答案 0 :(得分:0)
你的意思是json有像
这样的数据string
如果是这样,那就没有太多可以做的了,因为它只是破坏了JSON。 如果没有,你可以发布你想要阅读的JSON样本吗?
答案 1 :(得分:0)
我遇到了与上面类似的问题,但输入数据的变化很小json。
我有一个由json文件构建的外部表。除了一个msrp_currency之外,所有json密钥都被填充 这是DDL:
CREATE EXTERNAL TABLE foo.bar
( id string,
variants array<struct<pid:string, msrp_currency:string>>
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES ( "ignore.malformed.json" = "true" ,
'mapping.variants.msrp_currency' = 'variants.msrpcurrency')
LOCATION 'foo/bar'
除了msrp_currency(显示为NULL)之外,所有值都按预期显示。我需要引入下划线的原因是因为后来我需要使用brickhouse to_json UDF提取与msrpCurrecny相同的字段值。
样本值:
{ "pid": "mypid", "msrpCurrency": "USD" }