嵌套列类型转换后无法写回嵌套结构Parquet的SQL报错问询
解决嵌套JSON转Parquet时保留结构并指定字段类型的问题
首先,你遇到的报错核心原因是SQL语法不允许在别名里直接用.表示嵌套路径——解析器会把l1.l2.id里的点号当成语法错误,而非嵌套层级的标识。要保持嵌套结构同时修改字段类型,你需要手动重建嵌套的结构体(STRUCT),而不是直接用原路径作为别名。
正确的SQL写法示例
假设你的原JSON数据结构是l1 -> l2 -> id,同时l2还有其他字段(比如name),l1也有其他字段(比如type),你需要用STRUCT()函数逐层重建嵌套结构,在需要转换类型的字段上使用CAST():
CREATE TABLE cdg.`test2.parquet` AS SELECT -- 重建l1层级的结构体 STRUCT( -- 重建l2层级的结构体,在这里转换id的类型 STRUCT( CAST(t.l1.l2.id AS INTEGER) AS id, t.l1.l2.name -- 保留l2层的其他原有字段 ) AS l2, t.l1.type -- 保留l1层的其他原有字段 ) AS l1 FROM cdg.`data.json` t;
关键说明
- 每一层嵌套都需要用
STRUCT()包裹,并且通过AS 字段名指定层级名称,这样输出的Parquet才会和原JSON保持一致的嵌套结构。 - 如果有多个字段需要转换类型,只需要在对应的
STRUCT()里对目标字段做CAST()即可,其他字段直接引用原路径保留原有值和类型。 - 一定要确保所有需要保留的嵌套字段都被包含在
STRUCT()中,否则这些字段会丢失。
特殊场景处理
如果你的嵌套层级更深,或者包含数组类型的嵌套,逻辑是一致的:比如数组里的结构体需要转换字段类型,可以用TRANSFORM()函数遍历数组,在遍历过程中重建结构体并转换类型。例如:
-- 假设l1里有一个数组arr,每个元素是包含num字段的结构体 CREATE TABLE cdg.`test3.parquet` AS SELECT STRUCT( TRANSFORM(t.l1.arr, x -> STRUCT(CAST(x.num AS LONG) AS num, x.info AS info)) AS arr, t.l1.l2 AS l2 ) AS l1 FROM cdg.`data.json` t;
内容的提问来源于stack exchange,提问作者Chris de Groot
相关产品推荐
相关产品推荐

