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, убедись, что результат — строка в двойных кавычках, а затем уже передавай её дальше в приложение или инструмент визуализации. Проблема решена.