首页/数据/数据工程与 ETL 速查/spark-sql 命令行与脚本执行
管道基础52 条

spark-sql 命令行与脚本执行

spark-sql 提供 SQL 交互与批脚本执行:-e 执行单条语句、-f 跑 SQL 文件,适合调度器直接拉起纯 SQL 加工任务。

spark-sql 是什么

spark-sql 是 Spark 发行包自带的命令行入口,既能进交互式 shell 逐条试 SQL,也能用 -e 执行单条语句、用 -f 跑整个 SQL 文件。它启动的是一个真正常驻的 Spark 应用,SQL 会被转成执行计划交给集群跑,因此可以把纯 SQL 的加工逻辑直接交给调度器拉起,不必为每种加工写 Python 或 Scala 代码。

基本信息

交互模式spark-sql(进入交互式 shell)
批执行spark-sql -e "SQL" 或 spark-sql -f job.sql
附带配置spark-sql --conf k=v --database db --master yarn
初始化脚本-i 指定启动时先执行的 SQL 文件,适合放公共设置
位置Spark 发行包 bin/ 目录,与 spark-submit 同级
适用纯 SQL 加工、临时排查、调度器直接调起的任务

常用调用

常用调用
spark-sql -e "SELECT count(*) FROM dwd_order WHERE dt='2026-10-11';"
spark-sql -f /opt/jobs/dwd_order_daily.sql
spark-sql --master yarn --conf spark.sql.shuffle.partitions=400 -f job.sql
# 交互模式里先看执行计划再决定是否全量跑
#   进入后执行:EXPLAIN SELECT ... ;
spark-sql --database dwd -e "SHOW PARTITIONS dwd_order;"

典型使用场景

  • 纯 SQL 的日常加工任务:调度器用 -f 直接拉起,逻辑集中在 SQL 文件里便于评审
  • 临时排查:交互式连上仓库查看表结构与分区,确认数据是否已就绪
  • 一次性验证:用 -e 跑一条统计确认重跑结果与预期一致
  • 回归测试:把关键 SQL 放在脚本里按固定参数执行,结果可比对
  • 配合参数下发:通过 --conf 或变量覆盖日期等运行参数

常用参数读法

参数作用注意
-e执行单条(或分号分隔的)SQL语句过长时改用文件
-f执行 SQL 文件文件内注释建议整行书写
--conf设置 Spark 配置资源与并行度都应显式给
--database指定默认库避免脚本里到处写全限定名
--master指定运行模式交互式默认本地,生产要显式指定
-i启动时先执行的文件适合放 SET 与公共视图
先用 EXPLAIN 看分区裁剪与 join 策略,再全量跑;纯 SQL 任务同样需要资源参数,别用默认并行度硬扛。
交互式 shell 与脚本文件的会话级 SET 只在当前会话生效;调度任务若依赖某些 SET,必须写进同一个脚本或通过 --conf 下发,否则换个入口就失效。

易错点

  • 多语句 SQL 文件里每条语句用分号结尾,注释写在行首避免解析歧义
  • 交互式执行大查询默认资源小,长任务应通过 spark-submit 交给调度器
  • 脚本里依赖会话级 SET 却没随文件一起提交,线上执行时参数回到默认值
  • 用 -e 塞入很长的 SQL,引号转义容易出错,维护成本远高于用文件
  • 把输出直接打到控制台,结果集大时日志被撑爆,关键信息反而不易找到

数据来源与参考

  • Apache Spark 官方文档:Spark SQL CLI
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌