web-dev-qa-db-ja.com

Pyspark無効な入力例外エラー以外の試行

Pysparkを使用してs3から過去4か月のデータを読み取り、データを処理しようとしていますが、次の例外が発生します。

org.Apache.hadoop.mapred.InvalidInputException:入力パターンs3:// path_to_clickstream/date = 201508 *

毎月1日、s3パスにエントリがないため(別のジョブが処理してデータをs3パスにアップロードし、その前にジョブが実行されます)、ジョブは失敗します。この例外をキャッチして、ジョブが存在するすべてのパスの処理を続行できるようにする方法があるかどうか疑問に思っていました。

10
anonuser0428

ロードの直後に安価なアクションをトリガーして、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_inpu‌​tdir/month3*/"]

rdds = sc.union([try_load(path) for path in paths])

より適切な制御が必要な場合は、 list content および既知のファイルをロードできます。

これらのパスの少なくとも1つが空でない場合は、物事をさらに単純にして、次のようなglobを使用できるはずです。

sc.textFile("s3://path_to_inputdir/month[1-3]*/")
13
zero323