Есть ли способ динамически сканировать пути к папкам и выводить список всех файлов? - PullRequest
1 голос
/ 10 октября 2019

Я тестирую этот кусок кода.

dbutils.fs.ls("/mnt/rawdata/2019/01/01/corp/")

Это прекрасно работает для одной папки, но если я попробую строку ниже, это не получится.

dbutils.fs.ls("/mnt/rawdata/2019/01/*/corp/")

Есть лиспособ рекурсивного перечисления всех файлов в родительской папке и всех подпапках? Я хотел бы получить список файлов, передаваемых в фрейм данных.

Я попробовал приведенный ниже код, и он отлично работает для загрузки файлов с похожими именами во фрейм данных.

val myDFCsv = spark.read.format("csv")
   .option("sep","|")
   .option("inferSchema","true")
   .option("header","false")
   .load("mnt/rawdata/2019/01/*/corp/*.gz")

Однако я не хочу объединять похожие файлы, я хочу перечислить имена файлов и пути, где находятся эти файлы. Спасибо!

Ответы [ 2 ]

2 голосов
/ 11 октября 2019

Вы можете использовать Java API FileSystem.globStatus(Path pathPattern)

import org.apache.hadoop.fs.{FileSystem, Path}

val fs: FileSystem = FileSystem.get(spark.sparkContext.hadoopConfiguration)
val files = fs.globStatus(new Path("/mnt/rawdata/2019/01/*/corp/"))
files.foreach(println)
0 голосов
/ 13 октября 2019

Я наконец-то получил это на работу !!

import sys, os
import pandas as pd

mylist = []
root = "/dbfs/mnt/rawdata/"
path = os.path.join(root, "targetdirectory")
for path, subdirs, files in os.walk(root):
  for name in files:
    mylist.append(os.path.join(path, name))

len(mylist)
df = pd.DataFrame(mylist) 
...