pyspark 检测任务输出目录是否空,避免读取报错

96 篇文章 2 订阅
38 篇文章 0 订阅

前言

在跑调度任务时候,有时候子任务需要依赖前置任务的输出,但类似读取 Parquet 或者 Orc 文件时,如果不判断目录是否为空,在输出为空时会报错,所以需要 check 一下,此外Hadoop通常在写入数据时会在目录中生成一个名为_SUCCESS的文件来表示写入操作已成功完成,我们在检测时要排除这个文件

HDFS API 判断

from py4j.java_gateway import java_import
from pyspark.sql import SparkSession

# 初始化SparkSession
spark = SparkSession.builder.appName("Example").getOrCreate()

# 导入Hadoop FileSystem类
java_import(spark._jvm, 'org.apache.hadoop.fs.Path')
java_import(spark._jvm, 'org.apache.hadoop.fs.FileSystem')

# 定义要检查的路径
FEATURE_OUTPUT_PATH = "your_path_here"

# 获取Hadoop Configuration
hadoop_conf = spark._jsc.hadoopConfiguration()

# 获取FileSystem对象
fs = spark._jvm.FileSystem.get(hadoop_conf)

# 检查路径是否存在
path = spark._jvm.Path(FEATURE_OUTPUT_PATH)

if fs.exists(path):
    # 获取目录下所有的文件和子目录
    status_list = fs.listStatus(path)
    non_success_files = [file_status.getPath().getName() for file_status in status_list if
                         file_status.getPath().getName() != "_SUCCESS"]

    # 检查除_SUCCESS文件外是否还有其他文件
    if non_success_files:
        # 读取Parquet文件
        table = spark.read.format('parquet').option('header', 'true').load(FEATURE_OUTPUT_PATH)
    else:
        print("The directory is empty or only contains a _SUCCESS file.")
else:
    print("The path does not exist.")

本地 Shell 判断

注意这段脚本能使用的前提是,执行的机器上已经安装和配置了 HDFS 的 shell 命令

import subprocess

out=subprocess.check_output("hadoop fs -ls /tmp/file.txt",shell=True)

out=out.strip()

out=out.split("\n")

for l in out:

if l.endswith(".txt"):

print "file exit"
    else:
        print "file not exit"
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值