PySpark写入CSV仅生成_SUCCESS文件无实际数据的问题求助
常见成因排查(按出现概率排序)
- 最普遍的触发场景:执行写入的
df_reduced本身为空
Spark在写入空DataFrame时,不会生成任何实际数据文件,只会按照任务完成的标记约定生成_SUCCESS文件。交互式开发中最容易踩的坑包括:- 日志清洗、过滤环节条件设置过严,比如时间范围筛选、状态码匹配的逻辑写错,导致最终筛选后没有留存任何有效数据
- Zeppelin解释器上下文会话中断,你代码中引用的
df_reduced并非之前调试好的带数据版本,而是上一步空操作生成的空DataFrame
验证方式很简单,在执行写入代码前加一行df_reduced.count(),如果返回值为0,就需要回溯DataFrame的生成链路,修正过滤、关联的逻辑问题。
- 最容易出现的认知偏差:文件落盘位置和你检查的路径不匹配
如果你当前的Spark运行在分布式集群模式(Standalone/Yarn)下,写入代码里配置的/home/hduser/tmp这类本地路径,并不会把文件统一写到Zeppelin所在的服务器磁盘上——实际的数据文件会被分发写到各个Worker节点的本地磁盘对应目录下,你在Zeppelin所在的服务器上查路径自然找不到数据文件。
对应解决方式二选一:要么把写入路径替换为分布式存储(如HDFS)的统一目录,要么将Spark运行模式调整为local[*],让所有计算和落盘操作都在当前Zeppelin服务器上完成,再检查路径下的文件。
此外排查时要注意查看隐藏文件:Spark写入过程中会先生成带.前缀的临时占位文件,等待所有分区写入完成后才会重命名为正式的part-xxx.csv数据文件,不要因为没看到正式文件名就判定目录为空。 - 小概率触发问题:目录权限不足导致的静默空写
部分Spark版本中,如果当前运行Zeppelin解释器的用户对目标写入目录没有创建文件的权限,不会直接抛出清晰的权限报错,而是会跳过实际数据落盘的步骤,仅生成_SUCCESS标记文件。这种情况只要给目标目录开放对应用户的读写权限即可解决。
内容的提问来源于stack exchange,提问作者Marco_CH
相关产品推荐
相关产品推荐

