Spark - 从具有嵌套文件夹的目录中获取特定数据类型的所有文件名

时间:2017-09-05 10:37:16

标签: scala apache-spark

我有一个包含一些子文件夹的目录,其中包含不同的镶木地板文件。像这样:

2017-09-05
    10-00
        part00000.parquet
        part00001.parquet
    11-00
        part00000.parquet
        part00001.parquet
    12-00
        part00000.parquet
        part00001.parquet

我想要的是将路径传递到目录05-09以获取所有镶木地板文件的名称列表。

我能够以非常低效的方式实现它:

 val allParquetFiles = sc.wholeTextFiles("C:/MyDocs/2017-09-05/*/*.parquet")
 allParquetFiles.keys.foreach((k) => println("The path to the file is: "+k))

所以每个键都是我要找的名字,但这个过程要求我加载所有文件,然后我就不能使用了,因为我用二进制文件得到它们(我不知道如何转换他们进入数据框)。

我有了密钥(所以是filePaths列表),我打算调用:

val myParquetDF = sqlContext.read.parquet(filePath);

你可能已经明白我在Spark中很新。所以,如果有更快或更简单的方法来阅读位于不同文件夹中的镶木地板文件列表,请告诉我。

我的部分解决方案:我无法获取文件夹中所有文件名的所有路径,但我能够将该类型的所有文件的内容放入同一数据框中。这是我的最终目标。如果将来有人可能需要它,我使用以下行:

val df = sqlContext.read.parquet("C:/MyDocs/2017-05-09/*/*.parquet") 

感谢您的时间

2 个答案:

答案 0 :(得分:2)

您可以使用hdfs api这样做

import org.apache.hadoop.fs._
import org.apache.hadoop.conf._ 
val fs = FileSystem.get(new Configuration())
val files = ( fs.listStatus(new Path("C:/MyDocs/2017-09-05/*/*.parquet")) ).map(_.getPath.toString) 

答案 1 :(得分:1)

首先,最好避免使用wholeTextFiles。此方法立即读取整个文件。尝试使用textFile方法。 read more

其次,如果需要在一个目录中递归获取所有文件,可以通过textFile方法实现:

sc.hadoopConfiguration.set("mapreduce.input.fileinputformat.input.dir.recursive", "true")

此配置将启用递归搜索(适用于mapreduce作业的spark作业)。然后只需调用sc.textFile(path)