Trino: Finding out the data type of a value in Presto
Работаешь с Trino, копаешься в JSON-ках или вложенных MAP-ах, вытаскиваешь оттуда значения, а потом пытаешься понять — что это вообще такое? Число, строка, буле
Работаешь с Trino, копаешься в JSON-ках или вложенных MAP-ах, вытаскиваешь оттуда значения, а потом пытаешься понять — что это вообще такое? Число, строка, булево, массив? Потому что CAST в нужный тип без понимания исходного — это верный способ получить ошибку и потратить полдня на отладку простого запроса.
Особенно весело, когда схема данных плавающая или когда работаешь с сырыми, плохо документированными источниками. Начинаешь гадать: "123" — это строка или всё-таки integer, который надо преобразовать? А это null или пустая строка? Хочется взять значение и ткнуть в него системой, чтобы она вслух прокричала его тип.
Спроси у значения, кто его отец
В Trino (ранее Presto) для этого есть прямолинейная и элегантная функция typeof(). Она не спрашивает лишнего, она просто возвращает тип переданного ей выражения в виде строки. Это как DESCRIBE, но для одного конкретного значения внутри твоего запроса.
presto> select typeof(1), typeof('a');
_col0 | _col1
---------+------------
integer | varchar(1)
(1 row)
Всё. Никакой магии. Передал выражение — получил его тип на выходе. Это твой главный инструмент для рекогносцировки в незнакомых данных.
Где это пригождается на практике
Допустим, у тебя есть колонка params, которая является MAP(VARCHAR, JSON). И тебе нужно вытащить и типизировать значение по ключу user_id. Но ты не уверен, приходит ли он как число или как строка.
SELECT
params['user_id'] as raw_value,
typeof(params['user_id']) as type_hint
FROM events
LIMIT 5;
Результат покажет тебе, с чем ты имеешь дело. И тогда ты уже осознанно сделаешь CAST(params['user_id'] AS BIGINT) или AS VARCHAR.
Второй частый кейс — отладка сложных агрегаций или UDF. Когда результат вычисления ведёт себя странно, первым делом проверь типы промежуточных результатов через typeof. Часто оказывается, что где-то по дороге произошло неявное приведение, которое съело точность или сломало логику.
Это база
Функция typeof — это не про прод, это про исследование и отладку. Она нужна, чтобы быстро сориентироваться, построить правильную стратегию приведения типов и написать надёжный запрос. Добавь её в свой базовый набор для разведки данных, прямо рядом с SELECT * FROM ... LIMIT 10.
Когда в следующий раз будешь пялиться на непонятное значение из глубины сложной структуры, не гадай на кофейной гуще. Спроси его прямо: select typeof(?). И работай уже с фактами, а не предположениями.