我正在开发一个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读取数据。
答案 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])