Errors
Trino

Trino: Presto Produce JSON results

Ты запросил данные из колонки со структурой и получил странную нотацию `{column4=y}` вместо вменяемого JSON. Знакомо. Хочется просто взять и применить `JSON.par

Ты запросил данные из колонки со структурой и получил странную нотацию {column4=y} вместо вменяемого JSON. Знакомо. Хочется просто взять и применить JSON.parse(), но это же Trino (ранее Presto), здесь всё немного иначе.

Ты создал таблицу с колонкой типа struct<column4:string>. Это не JSON. Это внутренний SQL-тип данных, который Trino выводит в своём собственном лаконичном (читай: нестандартном) формате. Когда ты делаешь SELECT column3, движок просто показывает содержимое структуры, а не сериализует его в JSON.

Вот что происходит на самом деле. Ты запрашиваешь SQL-объект, ты его и получаешь. Чтобы получить JSON, этот объект нужно явно преобразовать.

Явное приведение — твой друг

Решение, которое ты уже нашел, правильное. Ключевое слово CAST — это выход.

SELECT CAST(column3 AS JSON) as column3_json
FROM normaldata_source

Эта команда заставляет Trino сериализовать значение column3 в валидную JSON-строку. На выходе будет {"column4":"y"}. Именно это тебе и нужно.

На скриншоте видно, что результат стал строкой, заключенной в двойные кавычки. Это и есть признак успеха — теперь это не внутреннее представление структуры, а стандартная JSON-строка, которую можно обрабатывать любым парсером.

Альтернативный путь

Иногда CAST может показаться слишком общим. Есть более явная встроенная функция json_format. Она делает ровно то же самое — преобразует значение типа SQL JSON (которым и является column3 после приведения) в отформатированную JSON-строку.

SELECT json_format(CAST(column3 AS JSON)) as column3_json
FROM normaldata_source

В данном случае это избыточно, так как CAST(... AS JSON) уже возвращает строку. Но знать про json_format полезно для других сценариев работы со сложными JSON-объектами.

Почему так, а не иначе

Короткий ответ — историческое наследие и производительность. Внутренний формат вывода {column4=y} читаем для глаза инженера, который отлаживает запрос прямо в консоли. Он сразу видит тип и значение. Преобразование в JSON — это дополнительная операция, которую движок не выполняет по умолчанию, чтобы не тратить ресурсы, если в этом нет необходимости.

Всегда помни о типах. struct<...> — это SQL-тип. JSON в контексте Trino — это тоже отдельный тип данных, а не просто строка. Преобразование между ними должно быть явным.

Итог простой. Хочешь JSON — явно проси его. Используй CAST(column AS JSON). Это правило работает не только для структур, но и для массивов (array), и для любых других сложных типов, которые нужно сериализовать.

Порядок действий: выполни запрос с CAST, убедись, что результат — строка в двойных кавычках, а затем уже передавай её дальше в приложение или инструмент визуализации. Проблема решена.