Pysparkを使用してs3から過去4か月のデータを読み取り、データを処理しようとしていますが、次の例外が発生します。
org.Apache.hadoop.mapred.InvalidInputException:入力パターンs3:// path_to_clickstream/date = 201508 *
毎月1日、s3パスにエントリがないため(別のジョブが処理してデータをs3パスにアップロードし、その前にジョブが実行されます)、ジョブは失敗します。この例外をキャッチして、ジョブが存在するすべてのパスの処理を続行できるようにする方法があるかどうか疑問に思っていました。
ロードの直後に安価なアクションをトリガーして、Py4JJavaError
をキャッチするだけです。
from py4j.protocol import Py4JJavaError
def try_load(path):
rdd = sc.textFile(path)
try:
rdd.first()
return rdd
except Py4JJavaError as e:
return sc.emptyRDD()
rdd = try_load(s3_path)
if not rdd.isEmpty():
run_the_rest_of_your_code(rdd)
編集:
複数のパスを処理する場合は、それぞれを個別に処理して、結果を組み合わせることができます。
paths = [
"s3://path_to_inputdir/month1*/",
"s3://path_to_inputdir/month2*/",
"s3://path_to_inputdir/month3*/"]
rdds = sc.union([try_load(path) for path in paths])
より適切な制御が必要な場合は、 list content および既知のファイルをロードできます。
これらのパスの少なくとも1つが空でない場合は、物事をさらに単純にして、次のようなglobを使用できるはずです。
sc.textFile("s3://path_to_inputdir/month[1-3]*/")