Databricks中如何将SQL查询结果存储为Excel或CSV文件
原代码报错核心原因
- 代码存在语法和逻辑断层:SQL查询语句和PySpark写入代码混写在同一执行逻辑中,既没有用
spark.sql()方法将SQL执行结果赋值给df变量,也没有指定单元格魔法命令区分SQL和Python执行块,直接运行会先触发语法错误,或者df未定义的引用错误 - 默认CSV写入逻辑未做配置:没有指定写入模式、表头参数,且Spark默认按分区输出多个分片文件,目标路径已存在时会直接抛错,也无法直接得到单个可打开的完整CSV文件
- 原生Spark不支持直接写入Excel格式,没有对应依赖时调用Excel写入方法会直接报类不存在错误
正确实现方法
存储为CSV格式
- 首先正确关联SQL查询结果和DataFrame变量,二选一即可:
- 方式1:在Python单元格中用Spark SQL接口执行查询,结果直接赋值给df
# 执行SQL查询,结果存入df变量 df = spark.sql("SELECT * FROM tablename")- 方式2:单独用SQL单元格执行查询,将结果存入临时视图再读取
再在Python单元格读取临时视图%sql -- SQL单元格执行查询,结果注册为临时视图 CREATE OR REPLACE TEMP VIEW temp_result AS SELECT * FROM tablename;df = spark.read.table("temp_result") - 写入CSV文件,根据使用场景选对应写法:
- 场景1:文件存储在Databricks集群文件系统
执行完成后到对应路径下,找到文件名以# coalesce(1)将所有分区合并为1个,输出单个CSV文件 # option("header","true")保留表头,mode("overwrite")自动覆盖已存在路径避免报错 df.coalesce(1).write.format("csv")\ .option("header", "true")\ .mode("overwrite")\ .save("/tmp/spark_output/datacsv")part-00000开头、后缀为.csv的文件就是完整结果。- 场景2:直接下载CSV文件到本地电脑
直接调用display()展示df结果,在结果面板右上角点击下载按钮,选择CSV格式即可直接导出单文件到本地,不需要手动处理分片路径。
注意:如果结果数据量超过100万行,不建议直接用display下载,容易触发浏览器内存限制,优先存到集群路径后再通过文件管理工具下载。
存储为Excel格式
- 先安装Excel写入需要的依赖,在notebook新建单元格运行以下命令,运行完成后按提示重启Python内核:
%pip install openpyxl - 执行写入逻辑:
df = spark.sql("SELECT * FROM tablename") # 合并为单分区输出单个xlsx文件 df.coalesce(1).write.format("com.crealytics.spark.excel")\ .option("header", "true")\ .mode("overwrite")\ .save("/tmp/spark_output/dataexcel")提示:单Excel文件最大支持1048576行数据,超过这个行数的结果会被截断,大数据量场景优先使用CSV格式存储。
内容的提问来源于stack exchange,提问作者SeleniumUser
相关产品推荐
相关产品推荐

