加载多个文件并且缺少一个文件时,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 标签