newHadoopAPI中的多个输入路径用于读取Lzo文件的spark

时间:2016-10-03 22:03:09

标签: hadoop apache-spark

我正在开发一个Spark应用程序,它必须从S3 Bucket和HDFS读取多个目录(即多个路径)。我读到newHadoopAPI提供了一种以高性能方式读取Lzo压缩/索引文件的好方法。但是,我们如何使用newHadoopAPI读取多个文件夹路径/目录在RDD中有多个Lzo文件和索引文件?

文件夹结构就像两列上的分区Hive Table一样。 例如:如下。对日期和批次进行分区

  

/rootDirectory/date=20161002/batch=5678/001_0.lzo   /rootDirectory/date=20161002/batch=5678/001_0.lzo.index   /rootDirectory/date=20161002/batch=5678/002_0.lzo   /rootDirectory/date=20161002/batch=5678/002_0.lzo.index   /rootDirectory/date=20161002/batch=8765/001_0.lzo   /rootDirectory/date=20161002/batch=8765/001_0.lzo.index   /rootDirectory/date=20161002/batch=8765/002_0.lzo   /rootDirectory/date=20161002/batch=8765/002_0.lzo.index

.....等等。

现在我使用以下代码从S3读取数据。这会将Lzo和Lzo.Index文件视为输入而导致我的应用程序崩溃,因为我不想读取.lzo.index文件,而只是使用索引获取速度的.lzo文件。

val impInput = sparkSession.sparkContext.newAPIHadoopFile("s3://my-bucket/myfolder/*/*", classOf[NonSplittableTextInputFormat],classOf[org.apache.hadoop.io.LongWritable],classOf[org.apache.hadoop.io.Text])
    val impRDD = impInput.map(_._2.toString)

有谁可以帮我理解我该怎么做?

1)。使用newHadoopAPI读取根目录下的所有(多个)文件夹,以便我可以利用.index文件。

2)。以类似的方式从HDFS读取数据。

1 个答案:

答案 0 :(得分:0)

为HDFS路径添加后缀可能会有所帮助。

val impInput = sparkSession.sparkContext.newAPIHadoopFile("s3://my-bucket/myfolder/*/*.lzo", classOf[NonSplittableTextInputFormat],classOf[org.apache.hadoop.io.LongWritable],classOf[org.apache.hadoop.io.Text])