在配置单元外部表中存储字段以\分隔的嵌套json

在配置单元外部表中存储字段以\分隔的嵌套json,json,hive,hdfs,hiveql,create-table,Json,Hive,Hdfs,Hiveql,Create Table,我有一个嵌套的JSON,其字段之间用\分隔。在将该JSON保存到配置单元外部表时,我遇到了一个错误 {"value":"{\"DUUID\": 67, \"GUUID\": 514, \"EOT\": 219.0, \"cc\": 3, \"enghr\": 20.0, \"battvolt\": 0.0, \"EOP\": 1

我有一个嵌套的JSON,其字段之间用\分隔。在将该JSON保存到配置单元外部表时,我遇到了一个错误

{"value":"{\"DUUID\": 67, \"GUUID\": 514, \"EOT\": 219.0, \"cc\": 3, \"enghr\": 20.0, \"battvolt\": 0.0, \"EOP\": 120.0, \"ts\": \"2020-12-31T14:22:37\", \"ts1\": 1609404757.2771647}"}
上面是我的json消息,它存储在hdfs/lambda3/test目录中

我在配置单元中编写了查询,如下所示---

请告诉我如何将这些JSON存储到配置单元表中。 提前感谢您

您的JSON“value”是一个包含JSON{
“value”:STRING
}的字符串,而不是嵌套的JSON结构。 嵌套的JSON结构应如下所示:

{"value": {"DUUID": 67, "GUUID": 514, "EOT": 219.0, "cc": 3, "enghr": 20.0, "battvolt": 0.0, "EOP": 120.0, "ts": "2020-12-31T14:22:37", "ts1": 1609404757.2771647}}
CAST(DUUID as int) as DUUID,
...
CAST(ts as timestamp) as ts,
CAST(ts1as timestamp) as ts1
如果无法修复JSON,则使用值字符串创建表,并使用JSON\u元组解析:

CREATE EXTERNAL TABLE demo1.json11(
value string 
) 
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' 
LOCATION 'hdfs://localhost:9000/lambda3/test/';


select DUUID, GUUID,EOT,cc,enghr,battvolt,EOP,ts,ts1
  from demo1.json11 j
       lateral view json_tuple (j.value, 'DUUID', 'GUUID','EOT','cc','enghr','battvolt','EOP','ts','ts1') e 
                           as DUUID, GUUID,EOT,cc,enghr,battvolt,EOP,ts,ts1
如有必要,转换类型,如下所示:

{"value": {"DUUID": 67, "GUUID": 514, "EOT": 219.0, "cc": 3, "enghr": 20.0, "battvolt": 0.0, "EOP": 120.0, "ts": "2020-12-31T14:22:37", "ts1": 1609404757.2771647}}
CAST(DUUID as int) as DUUID,
...
CAST(ts as timestamp) as ts,
CAST(ts1as timestamp) as ts1
您的JSON“value”是一个包含JSON{
“value”:STRING
}的字符串,而不是嵌套的JSON结构。 嵌套的JSON结构应如下所示:

{"value": {"DUUID": 67, "GUUID": 514, "EOT": 219.0, "cc": 3, "enghr": 20.0, "battvolt": 0.0, "EOP": 120.0, "ts": "2020-12-31T14:22:37", "ts1": 1609404757.2771647}}
CAST(DUUID as int) as DUUID,
...
CAST(ts as timestamp) as ts,
CAST(ts1as timestamp) as ts1
如果无法修复JSON,则使用值字符串创建表,并使用JSON\u元组解析:

CREATE EXTERNAL TABLE demo1.json11(
value string 
) 
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' 
LOCATION 'hdfs://localhost:9000/lambda3/test/';


select DUUID, GUUID,EOT,cc,enghr,battvolt,EOP,ts,ts1
  from demo1.json11 j
       lateral view json_tuple (j.value, 'DUUID', 'GUUID','EOT','cc','enghr','battvolt','EOP','ts','ts1') e 
                           as DUUID, GUUID,EOT,cc,enghr,battvolt,EOP,ts,ts1
如有必要,转换类型,如下所示:

{"value": {"DUUID": 67, "GUUID": 514, "EOT": 219.0, "cc": 3, "enghr": 20.0, "battvolt": 0.0, "EOP": 120.0, "ts": "2020-12-31T14:22:37", "ts1": 1609404757.2771647}}
CAST(DUUID as int) as DUUID,
...
CAST(ts as timestamp) as ts,
CAST(ts1as timestamp) as ts1

{“value”:“{“DUUID\”:67,“GUUID\”:514,“EOT\”:219.0,“cc\”:3,“enghr\”:20.0,“battvolt\”:0.0,“EOP\”:120.0,“ts\”:“2020-12-31T14:22:37\,“ts1\”:1609404757.2771647}这是有效负载结构您的有效负载不是嵌套的JSON-它有一个字符串形式的值。您需要处理该值,使其成为真正的json,而不是字符串。{“value”:“{“DUUID\”:67,“GUUID\”:514,“EOT\”:219.0,“cc\”:3,“enghr\”:20.0,“battvolt\”:0.0,“EOP\”:120.0,“ts\:“2020-12-31T14:22:37\”,“ts1\”:1609404757.2771647}这是有效负载结构您的有效负载不是嵌套的JSON-它有一个字符串形式的值。您需要处理该值,使其成为真正的json,而不是字符串。