LoginSignup
2
3

More than 5 years have passed since last update.

SparkのDataFrameReaderに渡すパスから存在しないものを予め除外する

Last updated at Posted at 2016-12-14

SparkのDataFrameReaderの json メソッドには、HDFSやS3に対するglobパターンを複数指定できます。

sqlContext.read.json(
  "s3://mybucket/data/year=2016/month=11/day=*/",
  "s3://mybucket/data/year=2016/month=12/day=*/",
  "s3://mybucket/data/year=2017/month=01/day=*/"
)

ただし、マッチするオブジェクトが一つも存在しないようなパスが含まれているとエラーになります。

org.apache.spark.sql.AnalysisException: Path does not exist: s3://mybucket/data/year=2017/month=01/day=*/;

今のところエラーを無視して存在するパスだけ読み出すようなオプションは用意されていないようです。
このため、予めglobパターンに対してマッチするオブジェクトが存在するかを確認する必要があります。
これは org.apache.hadoop.fs パッケージを利用すると実現できます。

import java.net.URI
import org.apache.hadoop.fs.{FileSystem, Path}
import org.apache.spark.SparkContext
import org.apache.spark.deploy.SparkHadoopUtil

def checkPathExists(path: String): Boolean = {
  val fs = FileSystem.get(new URI(path), sc.hadoopConfiguration)
  val p = new Path(path)
  val qualified = p.makeQualified(fs.getUri, fs.getWorkingDirectory)
  val glob = SparkHadoopUtil.get.globPathIfNecessary(qualified)
  glob.nonEmpty && fs.exists(glob.head)
}
checkPathExists("s3://mybucket/data/year=2017/month=01/day=*/")
// => false

参考

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3