我无法使用SnowSQL在这个非常简单的JSON对象中使用PARSE_JSON函数解析“国家”和“名称”

时间:2019-07-16 14:30:05

标签: json snowflake-datawarehouse data-ingestion

我正在从Azure Blob提取一个大型的简单json数据集,并将数据移动到带有FILE_FORMAT = json的名为“ cities_stage”的“阶段”中。

(这里是错误步骤,位于“错误解析JSON:未知关键字“ Hurzuf”,排名7”下面)。

create or replace stage cities_stage
url='azure://XXXXXXX.blob.core.windows.net/xxxx/landing/cities'
credentials=(azure_sas_token='?st=XXXXX&se=XXX&sp=racwdl&sv=XX&sr=c&sig=XXX')
FILE_FORMAT = (type = json);

然后我将其放在此工作台位置,并将其转储到具有单个变量列的表中,如下所示。我正在摄取的文件大于16mb,因此我通过使用type = json strip_outer_array = true

为每个对象创建单独的行
create or replace table cities_raw_source (
  src variant);

copy into cities_raw_source
  from @cities_stage
  file_format = (type = json strip_outer_array = true)
  on_error = continue;  

当我从citys_raw_source中选择* 时,每一行如下所示。

{
  "coord": {
    "lat": 44.549999,
    "lon": 34.283333
  },
  "country": "UA",
  "id": 707860,
  "name": "Hurzuf"
}

当我添加对“国家”或“名称”的引用时,这就是问题所在。这是我的查询(我在此未使用国家/地区,但结果相同)。

select parse_json(src:id),
  parse_json(src:coord:lat),
  parse_json(src:coord:lon),
  parse_json(src:name)
  from cities_raw_source;

错误:

解析JSON时出错:未知关键字“ Hurzuf”,排名7。

如果我删除“ src:name”,

ID,纬度和经度全部恢复正常

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

事实证明,除了查询本身,我一切都正确。

查询VARIANT列时,不需要PARSE_JSON,因此正确的查询应如下所示。

 select src:id,
  src:coord:lat,
  src:coord:lon,
  src:name
  from cities_raw_source;