Ошибки синтаксического анализа Json при использовании функции json_extract_path_text () в предложении where

У меня есть таблица Redshift, содержащая столбцы с объектами json. Я столкнулся с ошибками парсера json при попытке выполнить запросы в этой таблице, которая применяет определенные фильтры к содержимому объекта json. Хотя я могу использовать json_extract_path_text () в операторах выбора, то же самое не работает при использовании в предложении where.

Я вижу следующую ошибку: Недопустимая операция Amazon: ошибка синтаксического анализа JSON.

Когда я смотрю на таблицу STL_ERROR для получения дополнительных сведений, это то, что я вижу в сведениях об ошибке: errcode: 8001 контекст: ошибка синтаксического анализа JSON error : недопустимый объект json null

Ниже приводится пример содержимого одного такого столбца json:

{"att1":"att1_val","att2":"att2_val","att3":[{"att3_sub1_1":"att3_sub1_1_val","att3_sub1_2":"att3_sub1
select
json_extract_path_text(col_with_json_obj,'att4') as required_val
from table_with_json_data;
val"},{"att3_sub2_1":"att3_sub2_1_val","att3_sub2_2":"att3_sub2
select
json_extract_path_text(col_with_json_obj,'att4') as required_val
from table_with_json_data;
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;

Теперь, когда я использую json_extract_path_text () в предложении where, он не работает с указанной выше ошибкой:

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'.


person Hercules    schedule 25.03.2017    source источник


Ответы (1)


Это ошибка, которую вы получили бы, если бы table_with_json_data содержал хотя бы одну строку, в которой значение col_with_json_obj было четырехсимвольной строкой «null».

Чтобы избежать подобных ошибок, я бы рекомендовал создать Redshift UDF для проверки JSON. Метод is_json (), описанный в http://discourse.snowplowanalytics.com/t/more-robust-json-parsing-in-redshift-with-python-udfs/197 хорошо сработал для меня:

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), и этого класса ошибок можно будет полностью избежать.

person Jason Rosendale    schedule 29.03.2017
comment
Спасибо, Джейсон. Да, я заметил, что некоторые строки имеют строковое значение null, и их пришлось явно отфильтровать. Однако я до сих пор не понимаю, почему это работает в операторе select, а не в предложении where. Чтобы быть точным, условия, которые у меня есть в моем предложении where, должны отфильтровывать строки, которые имели строку null для этого столбца. - person Hercules; 10.04.2017
comment
@ Геркулес. У меня было такое же замешательство и разочарование. На форуме AWS Redshift есть вопрос, за которым вы можете следить, но ответа пока нет: forum.aws.amazon.com/thread.jspa?threadID=232468 - person nofinator; 03.08.2017