Errors
Trino

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(?). И работай уже с фактами, а не предположениями.