加载多个文件并且缺少一个文件时,PySpark 作业失败 [重复]

Posted

技术标签:

【中文标题】加载多个文件并且缺少一个文件时,PySpark 作业失败 [重复]【英文标题】:PySpark job fails when loading multiple files and one is missing [duplicate] 【发布时间】:2017-02-20 09:10:58 【问题描述】:

使用 PySpark 从 S3 加载多个 JSON 文件时出现错误,如果文件丢失,Spark 作业将失败。

原因:org.apache.hadoop.mapred.InvalidInputException:输入模式 s3n://example/example/2017-02-18/*.json 匹配 0 个文件

这就是我使用 PySpark 将最后 5 天添加到工作中的方式。

days = 5
x = 0
files = []

while x < days:
    filedate = (date.today() - timedelta(x)).isoformat()
    path = "s3n://example/example/"+filedate+"/*.json"
    files.append(path)
    x += 1

rdd = sc.textFile(",".join(files))                      
df = sql_context.read.json(rdd, schema)

如何让 PySpark 忽略丢失的文件并继续工作?

【问题讨论】:

【参考方案1】:

使用尝试加载文件的函数,如果文件丢失,则失败并返回 False。

from py4j.protocol import Py4JJavaError

def path_exist(sc, path):
    try:
        rdd = sc.textFile(path)
        rdd.take(1)
        return True
    except Py4JJavaError as e:
        return False

这使您可以在将文件添加到列表之前检查文件是否可用,而无需使用 AWS Cli 或 S3 命令。

days = 5
x = 0
files = []

while x < days:
    filedate = (date.today() - timedelta(x)).isoformat()
    path = "s3n://example/example/"+filedate+"/*.json"
    if path_exist(sc, path):
        files.append(path)
    else:
        print('Path does not exist, skipping: ' + path)
    x += 1

rdd = sc.textFile(",".join(files))                      
df = sql_context.read.json(rdd, schema)

我在http://www.learn4master.com/big-data/pyspark/pyspark-check-if-file-exists找到了这个解决方案

【讨论】:

这是一个相当糟糕的答案。这仅适用于仅读取少量数据的非生产系统。想象一下在一个 50GB 的文件夹上执行此操作。读取整个文件只返回真或假?

以上是关于加载多个文件并且缺少一个文件时,PySpark 作业失败 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Pyspark:如何在 Yarn 集群上运行作业时对多个文件使用 --files 标签

执行 Pyspark 作业时顶点失败

安装psutil时提示缺少python.h头文件(作记录)

通过 pyspark 加载文件名中包含冒号的 Amazon S3 文件

Pyspark:获取HDFS路径上的文件/目录列表

pyspark - 将 .csv 文件从 url 加载到 Spark 时出错