Apache Spark SQL Hive Row Format 语法详解:SERDE 与 DELIMITED 的完整使用指南
大数据数据分析批处理流处理机器学习图计算【免费下载链接】sparkApache Spark - A unified analytics engine for large-scale data processing项目地址https://gitcode.com/gh_mirrors/sp/spark点击查看免费下载本文档是 Apache Spark 官方 SQL 语法参考系列的一部分对应仓库文档 docs/sql-ref-syntax-hive-format.md。Hive Row Format 用于在CREATE TABLE与TRANSFORM含MAP/REDUCE等子句中指定 SerDe 类或文本分隔符是打通 Spark 与 Hive 生态数据读写格式的关键语法。读完本文你将掌握ROW FORMAT SERDE与ROW FORMAT DELIMITED两种定义方式、全部子句参数字段/集合/Map/行分隔符、NULL 表示、转义字符的语义与默认行为并理解 Spark 解析器与 Hive 底层 SerDe 属性之间的映射规则。一、概述DescriptionSpark 在CREATE TABLE和TRANSFORM子句中支持Hive row format用于指定 SerDe 类或文本分隔符。CREATE TABLE与TRANSFORM的row_format有两种定义方式SERDE子句指定一个自定义的 SerDe 类fully-qualified class nameDELIMITED子句为原生 SerDenative SerDe指定分隔符delimiter、转义字符escape character、空值字符null character等。从语法解析的实现看这两种方式最终都会被解析成同一份SerdeInfo数据结构定义于 statements.scala它统一承载storedAs、formatClasses、serde类名与serdeProperties键值对。ANTLR 文法 SqlBaseParser.g4 中的rowFormat规则完整对应了本文档的两种语法形态。二、语法Syntaxrow_format: SERDE serde_class [ WITH SERDEPROPERTIES (k1v1, k2v2, ... ) ] | DELIMITED [ FIELDS TERMINATED BY fields_terminated_char [ ESCAPED BY escaped_char ] ] [ COLLECTION ITEMS TERMINATED BY collection_items_terminated_char ] [ MAP KEYS TERMINATED BY map_key_terminated_char ] [ LINES TERMINATED BY row_terminated_char ] [ NULL DEFINED AS null_char ]两种形态互斥只能二选一。DELIMITED形态下除了FIELDS TERMINATED BY是可选项其余各子句均为可选可按需自由组合。2.1 row_format 可出现的语法位置row_format不仅仅出现在建表语句中。从 ANTLR 文法可以看出Spark 在以下语法位置都允许嵌入row_formatCREATE TABLE / CREATE TABLE LIKE建表时可指定行格式例如CREATE TABLE ... LIKE source (rowFormat | createFileFormat | locationSpec | TBLPROPERTIES ...)*见 SqlBaseParser.g4CREATE TABLE ... 含分区、分桶、SKEWED 等完整建表子句列表rowFormat与createFileFormat、locationSpec、bucketSpec等并列出现在建表选项列表中见 SqlBaseParser.g4INSERT OVERWRITE (LOCAL) DIRECTORY向目录写出数据时可指定rowFormat与createFileFormat见 SqlBaseParser.g4TRANSFORM / MAP / REDUCE 子句SELECT TRANSFORM(...) ... USING script的输入行格式inRowFormat与输出行格式outRowFormat见 SqlBaseParser.g4。2.2 解析器如何构建 SerdeInfo在 AstBuilder.scala 中visitRowFormat根据语法树节点类型分发RowFormatSerdeContext→visitRowFormatSerde把SERDE serde_name解析为SerdeInfo(serde Some(name), serdeProperties ...)WITH SERDEPROPERTIES中的键值对直接进入serdeProperties映射RowFormatDelimitedContext→visitRowFormatDelimited把 DELIMITED 形态中的每个分隔符映射为对应名称的 SerDe 属性详见下文第四节。三、参数说明Parameters参数语义说明SERDE serde_class指定自定义 SerDe 的完整限定类名fully-qualified class name必须给出可被类加载器加载的完整类路径例如 Hive 生态常见的org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe、JsonSerDe等SERDEPROPERTIES一组用于标记 SerDe 定义的键值对key-value pairs透传给 SerDe 的初始化属性例如(field.delim\t, serialization.format\t)FIELDS TERMINATED BY定义列分隔符column separator指定字段之间的分隔字符COLLECTION ITEMS TERMINATED BY定义集合元素分隔符collection item separator用于 Array、Struct 等集合类型内部元素的切分MAP KEYS TERMINATED BY定义 Map 键分隔符map key separator用于 Map 类型中键与值之间的切分LINES TERMINATED BY定义行分隔符row separatorSpark 仅接受\n其他字符会被拒绝见下文NULL DEFINED AS定义 NULL 的特定表示值指定文本文件中表示空值的字符序列ESCAPED BY转义机制escape mechanism指定转义字符用于转义分隔符或特殊字符注意SERDEPROPERTIES的键值对写法是kv1但在实际 SQL 中通常写作带引号的字符串键值对例如WITH SERDEPROPERTIES (field.delim \t)这在CREATE TABLE与TRANSFORM语法中均被支持。四、DELIMITED 子句与底层 SerDe 属性的映射源码级DELIMITED 形态的每个子句并不会被存成独立字段而是被转换成 Hive SerDe 的serdeProperties。visitRowFormatDelimited见 AstBuilder.scala逐项完成映射SQL 子句生成的 serdeProperties 键说明FIELDS TERMINATED BYfield.delim与serialization.format同时写入两个键供不同 SerDe 解析使用ESCAPED BYescape.delim转义字符COLLECTION ITEMS TERMINATED BYcolelction.delim注意拼写为colelction少一个 l源码注释明确说明这是继承自 Hive 的拼写错误必须沿用MAP KEYS TERMINATED BYmapkey.delimMap 键值分隔符LINES TERMINATED BYline.delim行分隔符NULL DEFINED AS——源码中entry(null, ...)尚未实现注释标注TODO we need proper support for the NULL format即当前 DELIMITED 形态对 NULL 自定义值的支持仍属 TODO 状态两个值得关注的实现细节LINES TERMINATED BY 只接受\n当LINES TERMINATED BY的值不是\n时解析器直接抛出QueryParsingErrors.unsupportedRowFormatLinesTerminatedByError见 AstBuilder.scala。这意味着在 Spark 中行分隔符实际上是固定为换行符的无法像 Hive 那样自由指定行分隔符。映射即 SerDe 属性DELIMITED 形态最终生成的也是一个SerdeInfo(serdeProperties entries.toMap)只是不指定serde类交由原生默认SerDe 读取这些属性。五、ROW FORMAT 与 STORED AS 的兼容性规则ROW FORMAT不能与任意文件格式随意组合。解析器在validateRowFormatFileFormat见 AstBuilder.scala中强制校验以下组合除此之外都会抛出 ParseExceptionROW FORMAT SERDE ... STORED AS [SEQUENCEFILE | RCFILE | TEXTFILE]—— 允许ROW FORMAT DELIMITED ... STORED AS TEXTFILE—— 允许ROW FORMAT ... STORED AS INPUTFORMAT ... OUTPUTFORMAT ...—— 允许显式指定 InputFormat/OutputFormat其他组合例如ROW FORMAT SERDE搭配PARQUET/ORC/AVRO等自带 SerDe 的格式或ROW FORMAT DELIMITED搭配非 TEXTFILE 格式—— 不允许。对应测试用例位于 DDLParserSuite.scala例如ROW FORMAT SERDE customSerde WITH SERDEPROPERTIES (propvalue)搭配STORED AS otherFormat会报错ROW FORMAT SERDE is incompatible with format otherformat, which also specifies a serdeROW FORMAT DELIMITED FIELDS TERMINATED BY ,搭配非 TEXTFILE 格式会报错ROW FORMAT DELIMITED is only compatible with textfile, not otherformat。六、实战示例6.1 CREATE TABLE 中使用 ROW FORMAT SERDE指定自定义 SerDe 类并透传 SerDe 属性CREATE TABLE hive_serde_table ( name STRING, age INT ) ROW FORMAT SERDE org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe WITH SERDEPROPERTIES ( field.delim \t, serialization.format \t );6.2 CREATE TABLE 中使用 ROW FORMAT DELIMITED使用原生 SerDe 并指定完整的分隔符组合CREATE TABLE hive_delimited_table ( id INT, name STRING, tags ARRAYSTRING, attributes MAPSTRING, STRING ) ROW FORMAT DELIMITED FIELDS TERMINATED BY , ESCAPED BY \\ COLLECTION ITEMS TERMINATED BY # MAP KEYS TERMINATED BY : LINES TERMINATED BY \n NULL DEFINED AS \\N;上例中字段用逗号切分数组元素用#切分Map 键值对用:切分转义字符为反斜杠NULL 在文本中以\N表示。注意LINES TERMINATED BY在 Spark 中只能取\n。6.3 CREATE TABLE LIKE 中继承行格式CREATE TABLE LIKE子句允许在复制表结构的同时显式覆盖行格式CREATE TABLE new_table LIKE source_table ROW FORMAT SERDE customSerde WITH SERDEPROPERTIES (prop value);6.4 TRANSFORM 子句中使用 ROW FORMATSELECT TRANSFORMMAP/REDUCE为其别名可以分别为脚本的输入与输出指定行格式SELECT TRANSFORM (id, name) ROW FORMAT DELIMITED FIELDS TERMINATED BY , USING /usr/bin/awk -F, \{print $1, toupper($2)}\ AS (id INT, name STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ,;6.5 INSERT OVERWRITE DIRECTORY 中使用 ROW FORMAT向目录导出文本时指定分隔符INSERT OVERWRITE LOCAL DIRECTORY /tmp/export ROW FORMAT DELIMITED FIELDS TERMINATED BY \t SELECT name, age FROM people;七、注意事项与限制结合源码行分隔符受限LINES TERMINATED BY仅接受\n设置其他字符会在解析阶段直接报错源码见 AstBuilder.scala。colelction.delim拼写是历史遗留COLLECTION ITEMS TERMINATED BY映射到的属性键为colelction.delimHive 拼写错误使用SERDEPROPERTIES直接手写属性时必须保持该拼写才能生效。NULL 自定义支持未完成NULL DEFINED AS在 DELIMITED 形态下尚未映射到任何 SerDe 属性源码中有对应 TODO 注释实际效果需要结合所用 SerDe 的自身属性如 LazySimpleSerDe 的serialization.null.format来实现。SERDE 与自带 SerDe 的文件格式不兼容PARQUET、ORC 等格式自带序列化方案不能与ROW FORMAT SERDE混用否则建表报错。SERDEPROPERTIES 是透传机制Spark 本身不解释属性值的业务含义只负责将其原样绑定到表/目录的 SerDe 上具体解析由对应 SerDe 类完成。八、相关资源本文档原文docs/sql-ref-syntax-hive-format.md语法文法定义SqlBaseParser.g4解析实现AstBuilder.scalaSerdeInfo 数据结构statements.scala兼容性与错误提示测试DDLParserSuite.scala赞分享大数据数据分析批处理流处理机器学习图计算【免费下载链接】sparkApache Spark - A unified analytics engine for large-scale data processing项目地址https://gitcode.com/gh_mirrors/sp/spark点击查看免费下载相关推荐Apache Spark SQL 的 LOAD DATA 语句向 Hive Serde 表装载数据文件的完整指南Apache Spark SQL 的 LOAD DATA 语句向 Hive Serde 表装载数据文件的完整指南 LOAD DATA 是 Apache Spa大数据数据分析批处理流处理机器学习图计算Apache Spark SQL 语法精解SHOW TABLES 命令的完整使用指南Apache Spark SQL 语法精解SHOW TABLES 命令的完整使用指南 导读 SHOW TABLES 是 Apache Spark SQL 中最大数据数据分析批处理流处理机器学习图计算Apache Spark SQL 集成 Hive UDF / UDAF / UDTF 完整指南Apache Spark SQL 集成 Hive UDF / UDAF / UDTF 完整指南 导读 本文以 Apache Spark 官方 SQL 参考文档大数据数据分析批处理流处理机器学习图计算创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Podman `--noheading` 选项完全指南:11 个列表命令的表头控制机制与实战用法

Podman `--noheading` 选项完全指南:11 个列表命令的表头控制机制与实战用法

Podman --noheading 选项完全指南:11 个列表命令的表头控制机制与实战用法 【免费下载链接】podman Podman: A tool for managing OCI containers and pods. 项目地址: https://gitcode.com/gh_mirrors/po/podman --noheading(短选项 -n&#xff…

2026/9/20 1:45:32 阅读更多 →
GetQzonehistory:一次性导出你的全部 QQ 空间历史说说

GetQzonehistory:一次性导出你的全部 QQ 空间历史说说

GetQzonehistory:一次性导出你的全部 QQ 空间历史说说 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory GetQzonehistory 是一个 QQ 空间历史说说导出工具。网页版 QQ 空间只能…

2026/9/20 1:45:32 阅读更多 →
Buzz 完整指南:本地免费语音转文字,离线音频转录一次讲清

Buzz 完整指南:本地免费语音转文字,离线音频转录一次讲清

Buzz 完整指南:本地免费语音转文字,离线音频转录一次讲清 【免费下载链接】buzz Buzz transcribes and translates audio offline on your personal computer. Powered by OpenAIs Whisper. 项目地址: https://gitcode.com/GitHub_Trending/buz/buzz Buzz 是一款免费开源…

2026/9/20 1:45:32 阅读更多 →

最新新闻

SSE 握手报 4xx Conflict?TaoToken 这样改 Codex 的 Base URL

SSE 握手报 4xx Conflict?TaoToken 这样改 Codex 的 Base URL

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/20 2:36:59 阅读更多 →
C-EVAL 评估跑分,用 TaoToken 让 Codex 验证准确率

C-EVAL 评估跑分,用 TaoToken 让 Codex 验证准确率

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/20 2:36:59 阅读更多 →
微生物数量测定全解析:从CFU平板计数到OD600标准曲线

微生物数量测定全解析:从CFU平板计数到OD600标准曲线

简介:本资源为《微生物数量测定.doc》,面向环境科学、生物工程及实验教学等领域的师生和科研人员,系统梳理微生物数量测定的核心技术体系。文中围绕计数器测定法、电子计数器计数法、平板菌落计数法、比浊法、测定细胞重量法、总氮/总碳量测定…

2026/9/20 2:36:59 阅读更多 →
Aider vs Cline:同一把 TaoToken Key 跑同一修复任务的 Token 消耗

Aider vs Cline:同一把 TaoToken Key 跑同一修复任务的 Token 消耗

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/20 2:36:59 阅读更多 →
ESP32与MAX30102血氧心率监测实战:从硬件配置到算法优化

ESP32与MAX30102血氧心率监测实战:从硬件配置到算法优化

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/20 2:36:59 阅读更多 →
TypeScript 异常处理实战指南:throw、Error 子类与“异常应属例外“的工程实践

TypeScript 异常处理实战指南:throw、Error 子类与“异常应属例外“的工程实践

TypeScript 异常处理实战指南:throw、Error 子类与"异常应属例外"的工程实践 【免费下载链接】typescript-book :books: The definitive guide to TypeScript and possibly the best TypeScript book :book:. Free and Open Source 🌹 项目地…

2026/9/20 2:35:58 阅读更多 →

日新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/20 0:00:46 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/20 0:00:46 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/20 0:00:46 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/20 0:00:46 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/20 0:00:46 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/20 0:00:46 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/19 23:01:36 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/19 17:50:38 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →