Lakehouse 数据类型转换指南

概述

在数据处理过程中,经常需要将数据从一种类型转换为另一种类型。云器 Lakehouse 提供多种类型转换语法,包括标准

CAST
CAST
、简写
::
::
、安全转换
TRY_CAST
TRY_CAST
以及自动隐式转换。本指南按常见业务场景分类,帮助你快速掌握高效、安全的类型转换方法。

涉及的 SQL 命令

命令/函数用途适用场景
CAST(expr AS type)
CAST(expr AS type)
标准类型转换通用类型转换,兼容标准 SQL
expr::type
expr::type
简写类型转换快速转换,代码更简洁
TRY_CAST(expr AS type)
TRY_CAST(expr AS type)
安全类型转换处理可能转换失败的数据,返回
nan
nan
而非报错
PARSE_JSON(str)
PARSE_JSON(str)
字符串转 JSON将 JSON 字符串解析为 JSON 类型
TO_DATE(str, fmt)
TO_DATE(str, fmt)
格式化日期转换非标准格式字符串转日期

前置准备

以下示例使用模拟的混合类型表

mixed_data
mixed_data

-- 创建测试表 CREATE TABLE IF NOT EXISTS mixed_data ( id INT, str_val STRING, num_val DOUBLE, date_val STRING ); -- 插入测试数据 INSERT INTO mixed_data VALUES (1, '100', 3.14, '2024-06-01'), (2, '200', 2.71, '2024/06/02'), (3, 'abc', 1.41, 'invalid_date'), (4, '300', NULL, '2024-06-04');


基础类型转换

使用

CAST
CAST
::
::
进行显式类型转换。两者功能等价,
::
::
语法更简洁。

-- 将字符串转换为整数 SELECT id, str_val, CAST(str_val AS INT) as cast_int, str_val::INT as shorthand_int FROM mixed_data WHERE str_val NOT IN ('abc');

结果说明

idstr_valcast_intshorthand_int
1100100100
2200200200
4300300300

安全类型转换

当数据中可能包含无法转换的值时,使用

TRY_CAST
TRY_CAST
可以避免查询报错,转换失败时返回特殊值
nan
nan

-- 安全转换:无法转换时返回 nan SELECT id, str_val, TRY_CAST(str_val AS INT) as safe_int FROM mixed_data;

结果说明

idstr_valsafe_int
1100100
2200200
3abcNULL
4300300

处理 TRY_CAST 结果

TRY_CAST
TRY_CAST
转换失败时返回
NULL
NULL
,可以直接使用
IS NULL
IS NULL
过滤:

-- 过滤转换失败的行 SELECT id, str_val, TRY_CAST(str_val AS INT) as safe_int FROM mixed_data WHERE TRY_CAST(str_val AS INT) IS NOT NULL;

结果说明

idstr_valsafe_int
1100100
2200200
4300300

日期时间转换

将字符串转换为日期或时间戳类型,支持标准格式和自定义格式。

-- 标准格式自动转换 SELECT id, date_val, CAST(date_val AS DATE) as std_date FROM mixed_data WHERE date_val LIKE '____-__-__';

结果说明

iddate_valstd_date
12024-06-012024-06-01
42024-06-042024-06-04

自定义格式转换

对于非标准格式,使用

TO_DATE
TO_DATE
指定格式模板:

-- 使用 TO_DATE 解析自定义格式 SELECT id, date_val, TO_DATE(date_val, 'yyyy/MM/dd') as custom_date FROM mixed_data WHERE date_val = '2024/06/02';


JSON 数据转换

将 JSON 字符串解析为 Lakehouse 原生的

JSON
JSON
类型,以便使用 JSON 函数进行查询。

-- 解析 JSON 字符串 SELECT id, PARSE_JSON('{"name": "Alice", "age": 30}') as json_data, json_extract_string(PARSE_JSON('{"name": "Alice", "age": 30}'), '$.name') as name FROM mixed_data WHERE id = 1;

结果说明

idjson_dataname
1{"name":"Alice","age":30}Alice

隐式转换规则

Lakehouse 在某些场景下会自动进行隐式转换,但建议显式转换以提高代码可读性和稳定性。

支持的隐式转换

  • 数值类型之间:
    INT
    INT
    DOUBLE
    DOUBLE
    (精度扩大)
  • 字符串与日期:在
    WHERE
    WHERE
    条件中,
    date_col = '2024-06-01'
    date_col = '2024-06-01'
    会自动转换

不支持的隐式转换

  • 写入操作
    INSERT INTO
    INSERT INTO
    时,字符串不能隐式转为
    DATE
    DATE
    TIMESTAMP
    TIMESTAMP
    JSON
    JSON
    BINARY
    BINARY
    ,必须使用显式转换。
  • 复杂类型
    STRING
    STRING
    不能隐式转为
    JSON
    JSON
    ARRAY
    ARRAY

-- ❌ 错误:写入时隐式转换 INSERT INTO target_table (date_col) VALUES ('2024-06-01'); -- ✅ 正确:显式转换 INSERT INTO target_table (date_col) VALUES (DATE '2024-06-01'); -- 或使用 CAST INSERT INTO target_table (date_col) VALUES (CAST('2024-06-01' AS DATE));


清理测试数据

完成类型转换验证后,建议清理测试表:

-- 删除测试表 DROP TABLE IF EXISTS mixed_data;


注意事项

  1. TRY_CAST 返回值:转换失败时返回
    NULL
    NULL
    ,可直接使用
    IS NULL
    IS NULL
    过滤。
  2. 日期格式严格
    CAST
    CAST
    转换日期时要求标准格式(
    yyyy-MM-dd
    yyyy-MM-dd
    ),非标准格式需使用
    TO_DATE(str, fmt)
    TO_DATE(str, fmt)
  3. 精度丢失
    DOUBLE
    DOUBLE
    INT
    INT
    会截断小数部分,
    DECIMAL
    DECIMAL
    INT
    INT
    会四舍五入。
  4. JSON 字段名大小写
    FROM_JSON
    FROM_JSON
    解析 schema 时会将字段名强制转为小写。如需保留大写,使用
    PARSE_JSON
    PARSE_JSON
  5. 日期字面量:推荐使用
    DATE '2024-06-01'
    DATE '2024-06-01'
    TIMESTAMP '2024-06-01 10:00:00'
    TIMESTAMP '2024-06-01 10:00:00'
    语法,比
    CAST
    CAST
    更简洁。

相关文档

联系我们
预约咨询
微信咨询
电话咨询