我有一个Redshift表,其中包含带有json对象的列。我尝试在此表上执行查询时遇到json解析器失败,该查询对json对象内容应用特定过滤器。 虽然我能够在select语句中使用json_extract_path_text(),但在where子句中使用时会失败。
以下是我看到的错误: Amazon无效操作:JSON解析错误;
当我查看STL_ERROR表以获取更多详细信息时,这是我在错误详细信息中看到的内容: 错误代码:8001 上下文: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文件,另一个使用 json' auto'
答案 0 :(得分:0)
如果table_with_json_data
包含col_with_json_obj
的值为{4}字符串" 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)
子句,并且可以完全避免此类错误。