Функция cast

Область применения:проверка помечены да Databricks SQL проверка помечены да Databricks Runtime

Приводит значение expr к типу данных type. Этот оператор является синонимом оператора :: (знак двоеточия)

Синтаксис

cast(sourceExpr AS targetType)

Аргументы

  • sourceExpr: любое выражение, допускающее приведение.
  • targetType — тип данных результата.

Возвраты

Результат имеет тип targetType.

Допустимы следующие сочетания приведения типов данных:

Источник (запись) Цель (столбец) VOID numeric STRING DATE TIMESTAMP TIMESTAMP_NTZ Интервал года в месяц интервал дня BOOLEAN BINARY ARRAY MAP STRUCT
VOID Y Y Y Y Y Y Y Y Y Y Y Y Y
numeric N Y Y N Y N Y Y Y N N N N
STRING N Y Y Y Y Y Y Y Y Y N N N
DATE N N Y Y Y Y N N N N N N N
TIMESTAMP N Y Y Y Y Y N N N N N N N
TIMESTAMP_NTZ N N Y Y Y Y N N N N N N N
Интервал года в месяц N Y Y N N N Y N N N N N N
интервал дня N Y Y N N N N Y N N N N N
BOOLEAN N Y Y N Y N N N Y N N N N
BINARY N Y Y N N N N N N Y N N N
ARRAY N N Y N N N N N N N Y N N
MAP N N Y N N N N N N N N Y N
STRUCT N N Y N N N N N N N N N Y

Правила и ограничения с учетом targetType

Предупреждение

В Databricks Runtime, если параметр spark.sql.ansi.enabledfalse, переполнение не приведет к ошибке, но вместо этого будет "упаковывать" результат.

Значение sourceExpr с недопустимым форматом или недопустимыми символами targetType приведет к NULL.

numeric

Если targetType является числом, а sourceExpr имеет тип:

  • VOID

    Результат будет иметь значение NULL для указанного числового типа.

  • numeric

    Если targetType является целочисленным, результат sourceExprусекается до целого числа.

    В противном случае результат sourceExprокругляется, чтобы соответствовать доступной шкале targetType.

    Если значение выходит за диапазон targetType, возникает ошибка переполнения.

    Используйте try_cast, чтобы преобразовать ошибки переполнения в NULL.

  • STRING

    sourceExpr считывается как литеральное значение targetType.

    Если sourceExpr не соответствует формату для литеральных значений, выдается ошибка.

    Если значение не входит в диапазон targetType, возникает ошибка переполнения.

    Используйте try_cast, чтобы преобразовать ошибки переполнения и недопустимого формата в NULL.

  • TIMESTAMP

    Результатом будет число секунд между 1970-01-01 00:00:00 UTC и sourceExpr.

    Если targetType является целочисленным, результат усекается до целого числа.

    В противном случае результат округляется, чтобы соответствовать доступной шкале targetType.

    Если результат не входит в диапазон targetType, возникает ошибка переполнения.

    Используйте try_cast, чтобы преобразовать ошибки переполнения в NULL.

  • INTERVAL

    Область применения:проверка помечены да Databricks SQL проверка помечены да Databricks Runtime 11.3 LTS и выше

    Целевой тип должен быть точным числовым значением.

    Учитывая INTERVAL upper_unit TO lower_unit, результат измеряется в общем числе lower_unit. Если lower_unit равно SECOND, дробные секунды хранятся справа от десятичной запятой. Для всех остальных интервалов результатом всегда является целое число.

  • BOOLEAN

    Если sourceExpr равно:

    • true — результатом будет 0.
    • false — результатом будет 1.
    • NULL — результатом будет NULL.

Примеры

> SELECT cast(NULL AS INT);
  NULL

> SELECT cast(5.6 AS INT);
  5

> SELECT cast(5.6 AS DECIMAL(2, 0));
  6

> SELECT cast(-5.6 AS INT);
  -5

> SELECT cast(-5.6 AS DECIMAL(2, 0));
  -6

> SELECT cast(128 AS TINYINT);
  Overflow

> SELECT cast(128 AS DECIMAL(2, 0));
  Overflow

> SELECT cast('123' AS INT);
  123

> SELECT cast('123.0' AS INT);
  Invalid format

> SELECT cast(TIMESTAMP'1970-01-01 00:00:01' AS LONG);
  1

> SELECT cast(TIMESTAMP'1970-01-01 00:00:00.000001' AS DOUBLE);
  1.0E-6

> SELECT cast(TIMESTAMP'2022-02-01 00:00:00' AS SMALLINT);
  error: overflow
> SELECT cast(true AS BOOLEAN);
  1

> SELECT cast(INTERVAL '1-2' YEAR TO MONTH AS INTEGER);
  14

> SELECT cast(INTERVAL '1:30.5' MINUTE TO SECOND AS DECIMAL(5, 2));
  90.50

> SELECT cast(TRUE AS INT);
  1

> SELECT cast(FALSE AS INT);
  0

STRING

Если targetType является типом STRING, а sourceExpr — типом:

  • VOID

    Результатом будет NULL для строки.

  • exact numeric

    Результатом будет литеральное число с необязательным знаком минуса и без начальных нулей, за исключением одной цифры слева от десятичной точки. Если targetType является DECIMAL(p, s), в котором s больше 0, добавляется десятичная точка и конечные нули для масштаба.

  • floating-point binary

    Если абсолютное число меньше 10,000,000 и больше или равно 0.001, результат выражается без экспоненциального представления по меньшей мере с одной цифрой на обеих сторонах десятичной точки.

    В противном случае Azure Databricks использует мантиссу, за которой следует E и экспонент. Мантисса имеет необязательный начальный знак минуса, за которым следует одна цифра слева от десятичной точки, и минимальное число цифр больше нуля справа. Экспонента имеет необязательный начальный знак минуса.

  • DATE

    Если год находится в диапазоне от 9999 г. до нашей эры до 9999 г. нашей эры, результатом будет dateString в виде -YYYY-MM-DD и YYYY-MM-DD соответственно.

    Для лет за рамками этого диапазона к компоненту года добавляется необходимое число цифр, при этом для нашей эры используется +.

  • TIMESTAMP

    Если год находится в диапазоне от 9999 г. до нашей эры до 9999 г. нашей эры, результатом будет timestampString в виде -YYYY-MM-DD hh:mm:ss и YYYY-MM-DD hh:mm:ss соответственно.

    Для лет за рамками этого диапазона к компоненту года добавляется необходимое число цифр, при этом для нашей эры используется +.

    При необходимости добавляются доли секунд .f....

  • TIMESTAMP_NTZ

    Если год находится в диапазоне от 9999 г. до нашей эры до 9999 г. нашей эры, результатом будет timestampString в виде -YYYY-MM-DD hh:mm:ss и YYYY-MM-DD hh:mm:ss соответственно.

    Для лет за рамками этого диапазона к компоненту года добавляется необходимое число цифр, при этом для нашей эры используется +.

    При необходимости добавляются доли секунд .f....

  • Интервал года в месяц

    Результатом будет его самое краткое представление для литерала интервала. Если интервал отрицательный, знак вставляется в interval-string. Для единиц меньше 10 начальные нули опускаются.

    Типичная строка year-month interval имеет следующий вид:

    • INTERVAL 'Y' YEAR
    • INTERVAL 'Y-M' YEAR TO MONTH
    • INTERVAL 'M' MONTH
  • интервал дня

    Результатом будет его самое краткое представление для литерала интервала. Если интервал отрицательный, знак вставляется в interval-string. Для единиц меньше 10 начальные нули опускаются.

    Типичная строка day-time interval имеет следующий вид:

    • INTERVAL 'D' DAY
    • INTERVAL 'D h' DAY TO HOUR
    • INTERVAL 'D h:m' DAY TO MINUTE
    • INTERVAL 'D h:m:s' DAY TO SECOND
    • INTERVAL 'h' HOUR
    • INTERVAL 'h:m' HOUR TO MINUTE
    • INTERVAL 'm:s' MINUTE TO SECOND
    • INTERVAL 's' SECOND
  • BOOLEAN

    Результатом true для boolean будет true литерала для STRING, для false — false литерала для STRING, а для NULL — NULL для строки.

  • BINARY

    Результатом будет двоичное свойство sourceExpr, которое интерпретируется как последовательность символов UTF-8.

    Azure Databricks не проверяет символы UTF-8. Приведение от BINARY к STRING не внедряет символы подстановки и не выдает ошибки.

  • ARRAY

    Результатом будет разделенный запятыми список приведенных элементов, которые заключаются в фигурные скобки [ ]. За каждой запятой следует один пробел. Элемент NULL преобразуется в литерал null.

    Azure Databricks не содержит кавычки или помечает отдельные элементы, которые могут содержать скобки или запятые.

  • MAP

    Результатом будет разделенный запятыми список приведенных пар "ключ — значение", которые заключаются в фигурные скобки { }. За каждой запятой следует один пробел. Каждая пара "ключ — значение" разделяется ->. Значение сопоставления NULL преобразуется в литерал null.

    Azure Databricks не содержит кавычки или помечает отдельные ключи или значения, которые могут содержать фигурные скобки, запятые или ->значения.

  • STRUCT

    Результатом будет разделенный запятыми список значений поля приведения, которые заключаются в фигурные скобки { }. За каждой запятой следует один пробел. Значение поля NULL преобразуется в литеральное значение null.

    Azure Databricks не цитирует или помечает отдельные значения полей, которые могут содержать фигурные скобки или запятые.

Примеры

> SELECT cast(NULL AS STRING);
  NULL

> SELECT cast(-3Y AS STRING);
  -3

> SELECT cast(5::DECIMAL(10, 5) AS STRING);
  5.00000

> SELECT cast(12345678e-4 AS STRING);
  1234.5678

> SELECT cast(1e7 as string);
  1.0E7

> SELECT cast(1e6 as string);
  1000000.0

> SELECT cast(1e-4 as string);
  1.0E-4

> SELECT cast(1e-3 as string);
  0.001

> SELECT cast(12345678e7 AS STRING);
  1.2345678E14

> SELECT cast(DATE'1900-12-31' AS STRING);
  1900-12-31

-- Caesar no more
> SELECT cast(DATE'-0044-03-15' AS STRING);
  -0044-03-15

> SELECT cast(DATE'100000-12-31' AS STRING);
  +100000-12-31

> SELECT cast(current_timestamp() AS STRING);
  2022-04-02 22:29:09.783

> SELECT cast(TIMESTAMP_NTZ'2023-01-01' AS STRING);
  2023-01-01 00:00:00

> SELECT cast(INTERVAL -'13-02' YEAR TO MONTH AS STRING);
  INTERVAL '-13-2' YEAR TO MONTH

> SELECT cast(INTERVAL '12:04.9900' MINUTE TO SECOND AS STRING);
  INTERVAL '12:04.99' MINUTE TO SECOND

> SELECT cast(true AS STRING);
  true

> SELECT cast(false AS STRING);
  false

-- A bad UTF-8 string
> SELECT cast(x'33800033' AS STRING);
  3�3

> SELECT hex(cast(x'33800033' AS STRING));
  33800033

> SELECT cast(array('hello', NULL, 'world') AS STRING);
  [hello, null, world]

> SELECT cast(array('hello', 'wor, ld') AS STRING);
  [hello, wor, ld]

> SELECT cast(array() AS STRING);
  []

> SELECT cast(map('hello', 1, 'world', null) AS STRING);
  {hello -> 1, world -> null}

> SELECT cast(map('hello -> 1', DATE'2022-01-01') AS STRING);
  {hello -> 1 -> 2022-01-01}

> SELECT cast(map() AS STRING);
  {}

> SELECT cast(named_struct('a', 5, 'b', 6, 'c', NULL) AS STRING);
  {5, 6, null}

> SELECT cast(named_struct() AS STRING);
  {}

DATE

Если targetType является типом DATE, а sourceExpr — типом:

  • VOID

    Результатом будет NULL DATE.

  • STRING

    sourceExpr должно быть допустимым значением dateString.

    Если sourceExpr это недопустимо dateString, Azure Databricks возвращает ошибку.

    Используйте try_cast, чтобы преобразовать ошибки о недопустимых данных в NULL.

  • TIMESTAMP

    Результатом будет часть даты sourceExpr для timestamp.

  • TIMESTAMP_NTZ

    Результатом является часть даты timestamp_ntz sourceExpr.

Примеры

> SELECT cast(NULL AS DATE);
  NULL

> SELECT cast('1900-10-01' AS DATE);
  1900-10-01

> SELECT cast('1900-10-01' AS DATE);
  1900-10-01

-- There is no February 30.
> SELECT cast('1900-02-30' AS DATE);
  Error

> SELECT cast(TIMESTAMP'1900-10-01 12:13:14' AS DATE);
  1900-10-01

> SELECT cast(TIMESTAMP_NTZ'1900-10-01 12:13:14' AS DATE);
  1900-10-01

TIMESTAMP

Если targetType является типом TIMESTAMP, а sourceExpr — типом:

  • VOID

    Результатом будет NULL DATE.

  • numeric

    sourceExpr считывается как число секунд с 1970-01-01 00:00:00 UTC.

    Дроби меньше микросекунды усекаются.

    Если значение не входит в диапазон TIMESTAMP, возникает ошибка переполнения.

    Используйте try_cast, чтобы преобразовать ошибки переполнения в NULL.

  • STRING

    sourceExpr должно быть допустимым значением timestampString.

    Если sourceExpr это недопустимо timestampString, Azure Databricks возвращает ошибку.

    Используйте try_cast, чтобы преобразовать ошибки о недопустимых данных в NULL.

  • DATE

    Результатом будет DATE для sourceExpr в 00:00:00 ч.

  • TIMESTAMP_NTZ

Результатом является значение метки времени с тем же годом/ месяцем/днем/часом/минутой/секундой timestamp_ntz sourceExpr.

Примеры

> SELECT cast(NULL AS TIMESTAMP);
  NULL

> SET TIME ZONE '+00:00';
> SELECT cast(0.0 AS TIMESTAMP);
  1970-01-01 00:00:00

> SELECT cast(0.0000009 AS TIMESTAMP);
  1970-01-01 00:00:00

> SELECT cast(1e20 AS TIMESTAMP);
  Error: overflow

> SELECT cast('1900' AS TIMESTAMP);
  1900-01-01 00:00:00

> SELECT cast('1900-10-01 12:13:14' AS TIMESTAMP);
  1900-10-01 12:13:14

> SELECT cast('1900-02-30 12:13:14' AS TIMESTAMP);
  Error

> SELECT cast(DATE'1900-10-01' AS TIMESTAMP);
  1900-10-01 00:00:00

> SELECT cast(TIMESTAMP_NTZ'2023-01-01 02:03:04.567' as TIMESTAMP)
  2023-01-01 02:03:04.567

TIMESTAMP_NTZ

targetType Если тип TIMESTAMP_NTZ и sourceExpr имеет тип:

  • VOID

    Результатом будет NULL DATE.

  • STRING

    sourceExpr должно быть допустимым значением timestampString.

    Если sourceExpr это недопустимо timestampString, Azure Databricks возвращает ошибку.

    Используйте try_cast, чтобы преобразовать ошибки о недопустимых данных в NULL.

  • DATE

    Результатом будет DATE для sourceExpr в 00:00:00 ч.

  • TIMESTAMP

Результатом является локальное время в часовом sourceExpr поясе сеанса.

Примеры

> SELECT cast(NULL AS TIMESTAMP_NTZ);
  NULL

> SELECT cast('1900' AS TIMESTAMP_NTZ);
  1900-01-01 00:00:00

> SELECT cast('1900-10-01 12:13:14' AS TIMESTAMP_NTZ);
  1900-10-01 12:13:14

> SELECT cast('1900-02-30 12:13:14' AS TIMESTAMP_NTZ);
  Error

> SELECT cast(DATE'1900-10-01' AS TIMESTAMP_NTZ);
  1900-10-01 00:00:00

> SELECT current_timezone(), CAST(TIMESTAMP'2021-7-1T8:43:28' as TIMESTAMP_NTZ);
  America/Los_Angeles 2021-07-01 08:43:28

> SELECT current_timezone(), CAST(TIMESTAMP'2021-7-1T8:43:28UTC+3' as TIMESTAMP_NTZ);
  America/Los_Angeles 2021-06-30 22:43:28

Интервал месяцев года

Если targetType является типом year-month interval, а sourceExpr — типом:

  • VOID

    Результатом будет NULL для year-month interval.

  • integral_numeric

    Область применения:проверка помечены да Databricks SQL проверка помечены да Databricks Runtime 11.3 LTS и выше

    Числовое значение интерпретируется как число более низких единиц targetTypeyearmonthIntervalQualifier.

  • STRING

    sourceExpr должно быть допустимым значением yearMonthIntervalString.

    Если sourceExpr это недопустимо yearMonthIntervalString, Azure Databricks возвращает ошибку.

    Используйте try_cast, чтобы преобразовать ошибки о недопустимых данных в NULL.

  • Интервал года в месяц

    Если targetTypeyearMonthIntervalQualifier включает MONTH, значение не изменяется, но интерпретируется повторно для обеспечения соответствия целевому типу.

    В противном случае yearMonthIntervalQualifier исходного типа включает MONTH, а результат усекается до целого числа лет.

Примеры

> SELECT cast(NULL AS INTERVAL YEAR);
  NULL

> SELECT cast('1-4' AS INTERVAL YEAR TO MONTH)::STRING;
  INTERVAL '1-4' YEAR TO MONTH

> SELECT cast('1' AS INTERVAL YEAR TO MONTH);
  error

> SELECT cast(INTERVAL '1-4' YEAR TO MONTH AS INTERVAL MONTH)::STRING;
  INTERVAL '16' MONTH

> SELECT cast(14 AS INTERVAL YEAR TO MONTH)::STRING;
  INTERVAL '1-2' YEAR TO MONTH

> SELECT cast(INTERVAL '1-11' YEAR TO MONTH AS INTERVAL YEAR)::STRING;
  INTERVAL '1' YEAR

Интервал времени дня

Если targetType является типом day-time interval, а sourceExpr — типом:

  • VOID

    Результатом является NULL для day-time interval.

  • exact_numeric

    Область применения:проверка помечены да Databricks SQL проверка помечены да Databricks Runtime 11.3 LTS и выше

    Числовое значение интерпретируется как число более низких единиц targetTypedayTimeIntervalQualifier. Если единицей является SECOND, доли интерпретируются как доли секунды.

  • STRING

    Значением свойства sourceExpr должна быть допустимая строка dayTimeIntervalString.

    Если sourceExpr это недопустимо dayTimeIntervalString, Azure Databricks возвращает ошибку.

    Используйте try_cast, чтобы преобразовать ошибки о недопустимых данных в NULL.

  • интервал дня

    Если targetTypedayTimeIntervalQualifier включает наименьшую единицу dayTimeIntervalQualifier исходного типа, значение не изменяется, но интерпретируется повторно для обеспечения соответствия целевому типу.

    В противном случае интервал sourceExpr усекается для обеспечения соответствия targetType.

> SELECT cast(NULL AS INTERVAL HOUR);
  NULL

> SELECT cast('1 4:23' AS INTERVAL DAY TO MINUTE)::STRING;
  INTERVAL '1 04:23' DAY TO MINUTE

> SELECT cast('1' AS INTERVAL DAY TO MINUTE);
  error

> SELECT cast(INTERVAL '1 4:23' DAY TO MINUTE AS INTERVAL MINUTE)::STRING;
  INTERVAL '1703' MINUTE

> SELECT cast(INTERVAL '1 4:23' DAY TO MINUTE AS INTERVAL HOUR)::STRING;
  INTERVAL '28' HOUR

> SELECT cast(125.3 AS INTERVAL MINUTE TO SECOND)::STRING;
  INTERVAL '2:5.3' MINUTE TO SECOND

BOOLEAN

Если targetType является типом BOOLEAN, а sourceExpr — типом:

  • VOID

    Результатом будет NULL для Boolean.

  • numeric

    Если sourceExpr равно:

    • 0 — результатом будет false.

      В противном случае результат будет true.

  • STRING

    Если sourcEexpr имеет значение (без учета регистра):

    • 'T', 'TRUE', 'Y', 'YES', or '1' — результатом будет true.
    • 'F', 'FALSE', 'N', 'NO', or '0' — результатом будет false.
    • NULL — результатом будет NULL.

    В противном случае Azure Databricks возвращает недопустимый синтаксис ввода для логической ошибки типа.

    Используйте try_cast, чтобы преобразовать ошибки о недопустимых данных в NULL.

Примеры

> SELECT cast(NULL AS BOOLEAN);
  NULL

> SELECT cast('T' AS BOOLEAN);
  true

> SELECT cast('True' AS BOOLEAN);
  true

> SELECT cast('1' AS BOOLEAN);
  true

> SELECT cast('0' AS BOOLEAN);
  false

> SELECT cast('n' AS BOOLEAN);
  false

> SELECT cast('on' AS BOOLEAN);
  error: invalid input syntax for type boolean

> SELECT cast(0 AS BOOLEAN);
  false

> SELECT cast(0.0E10 AS BOOLEAN);
  false

> SELECT cast(1 AS BOOLEAN);
  true

> SELECT cast(0.1 AS BOOLEAN);
  true

> SELECT cast('NaN'::FLOAT AS BOOLEAN);
  true

BINARY

Если targetType является типом BINARY, а sourceExpr — типом:

  • VOID

    Результатом будет NULL для Binary.

  • STRING

    Результатом будет кодирование UTF-8 для surceExpr.

Примеры

> SELECT cast(NULL AS BINARY);
  NULL

> SELECT hex(cast('Spark SQL' AS BINARY));
  537061726B2053514C

> SELECT hex(cast('Oдesa' AS BINARY));
  4FD0B4657361

ARRAY

targetType Если объект ARRAY < targetElementType > имеет sourceExpr тип:

  • VOID

    Результатом будет значение NULL для targeType.

  • ARRAY < sourceElementType >

    Если приведение sourceElementType к targetElementType поддерживается, результатом будет ARRAY<targetElementType>, в котором все элементы приведены к targetElementType.

    Azure Databricks вызывает ошибку, если приведение не поддерживается или если ни один из элементов не может быть приведение.

    Используйте try_cast, чтобы преобразовать недопустимые данные или ошибки переполнения в NULL.

Примеры

> SELECT cast(NULL AS ARRAY<INT>);
  NULL

> SELECT cast(array('t', 'f', NULL) AS ARRAY<BOOLEAN>);
  [true, false, NULL]

> SELECT cast(array('t', 'f', NULL) AS INTERVAL YEAR);
  error: cannot cast array<string> to interval year

> SELECT cast(array('t', 'f', 'o') AS ARRAY<BOOLEAN>);
  error: invalid input syntax for type boolean: o.

MAP

targetType Если используется map < targetKeyType, targetValueType > и sourceExpr имеет тип:

  • VOID

    Результатом будет значение NULL для targetType.

  • MAP <sourceKeyType, sourceValueType >

    Если приведения от sourceKeyType к targetKeyType и sourceValueType к targetValueType поддерживаются, результатом будет MAP<targetKeyType, targetValueType>, в котором все ключи приведены к targetKeyType, а все значения — к targetValueType.

    Azure Databricks вызывает ошибку, если приведение не поддерживается или если ни один из ключей или значений не может быть приведение.

    Используйте try_cast, чтобы преобразовать недопустимые данные или ошибки переполнения в NULL.

Примеры

> SELECT cast(NULL AS MAP<STRING, INT>);
  NULL

> SELECT cast(map('10', 't', '15', 'f', '20', NULL) AS MAP<INT, BOOLEAN>);
  {10:true,15:false,20:null}

> SELECT cast(map('10', 't', '15', 'f', '20', NULL) AS MAP<INT, ARRAY<INT>>);
  error: cannot cast map<string,string> to map<int,array<int>>

> SELECT cast(map('10', 't', '15', 'f', '20', 'o') AS MAP<INT, BOOLEAN>);
  error: invalid input syntax for type boolean: o.

STRUCT

targetType Если используется STRUCT <[targetFieldName: targetFieldType [NOT NULL] [COMMENT str] [, ...]] > и sourceExpr имеет тип:

  • VOID

    Результатом будет значение NULL для targetType.

  • STRUCT < [sourceFieldName: sourceFieldType [NOT NULL] [COMMENT str] [, ...]] >

    sourceExpr можно привести к targetType, если выполняются все такие условия:

    • Тип источника имеет такое же количество полей, что и целевой объект.
    • Для всех полей sourceFieldTypeN можно привести к targetFieldTypeN.
    • Для всех значений полей значение N исходного поля можно привести к targetFieldTypeN, при этом значение не равно NULL, если целевое поле N помечено как NOT NULL.

    Значения sourceFieldName, ограничения NOT NULL источника и COMMENT источника не обязаны соответствовать targetType и игнорируются.

    Azure Databricks вызывает ошибку, если приведение не поддерживается или если ни один из ключей или значений не может быть приведение.

    Используйте try_cast, чтобы преобразовать недопустимые данные или ошибки переполнения в NULL.

Примеры

> SELECT cast(NULL AS STRUCT<a:INT>);
  NULL

> SELECT cast(named_struct('a', 't', 'b', '1900') AS STRUCT<b:BOOLEAN, c:DATE NOT NULL COMMENT 'Hello'>);
  {"b":true,"c":1900-01-01}

> SELECT cast(named_struct('a', 't', 'b', NULL::DATE) AS STRUCT<b:BOOLEAN, c:DATE NOT NULL COMMENT 'Hello'>);
  error: cannot cast struct<a:string,b:date> to struct<b:boolean,c:date>

> SELECT cast(named_struct('a', 't', 'b', '1900') AS STRUCT<b:BOOLEAN, c:ARRAY<INT>>);
  error: cannot cast struct<a:string,b:string> to struct<b:boolean,c:array<int>>

> SELECT cast(named_struct('a', 't', 'b', 'hello') AS STRUCT<b:BOOLEAN, c:DATE>);
  error: Cannot cast hello to DateType