在where子句中使用json_extract_path_text()函数时Json解析错误

问题描述 投票:0回答:2

我有一个 Redshift 表,其中包含带有 json 对象的列。我在尝试在此表上执行对 json 对象内容应用特定过滤器的查询时遇到 json 解析器失败。 虽然我可以在 select 语句中使用 json_extract_path_text() ,但在 where 子句中使用时也会失败。

以下是我看到的错误: Amazon 无效操作:JSON 解析错误;

当我查看 STL_ERROR 表以获取更多详细信息时,这是我在错误详细信息中看到的内容: 错误代码:8001 context:JSON 解析错误 错误:无效的json对象null

以下是此类 json 列中的内容示例:

{"att1":"att1_val","att2":"att2_val","att3":[{"att3_sub1_1":"att3_sub1_1_val","att3_sub1_2":"att3_sub1_2_val"},{"att3_sub2_1":"att3_sub2_1_val","att3_sub2_2":"att3_sub2_2_val"}],"att4":"att4_val","att5":"att5_val"}

现在,当我运行以下查询时,它执行时没有任何问题:

select
json_extract_path_text(col_with_json_obj,'att4') as required_val
from table_with_json_data;

现在,当我在 where 子句中使用 json_extract_path_text() 时,它会失败并出现上述错误:

select
json_extract_path_text(col_with_json_obj,'att4') as required_val
from table_with_json_data
where json_extract_path_text(col_with_json_obj,'att4') = 'att4_val';

我这里有什么使用不正确或遗漏的东西吗?

P.S:我有另一个具有类似架构的表,并且相同的查询在该表上运行得很好。两个表之间的唯一区别是数据加载方式 - 一个在复制选项中使用 jsonpaths file,另一个使用 json 'auto'

amazon-redshift
2个回答
1
投票

如果

table_with_json_data
包含一行,其中
col_with_json_obj
的值为四字符字符串“null”,则您会收到此错误。

为了避免此类错误,我建议创建一个 Redshift UDF 来验证 JSON。 http://discourse.snowplowanalytics.com/t/more-robust-json-parsing-in-redshift-with-python-udfs/197中描述的 is_json() 方法对我来说效果很好:

create or replace function is_json(j varchar(max))
  returns boolean
  stable as $$
    import json
    try:
      json_object = json.loads(j)
    except ValueError, e:
      return False
    return True
  $$ language plpythonu;

然后您可以在查询中添加一个

and where is_json(col_with_json_obj)
子句,这样就可以完全避免此类错误。


0
投票

对我来说,当我首先使用 case when 语句,创建一个新列,然后使用该新列来过滤掉我想要保留的观察结果时,它就起作用了。

© www.soinside.com 2019 - 2024. All rights reserved.