如何在数据块中使用通配符列出文件



我想列出adls文件夹中所有的parquet文件。

dbutils.fs.ls("abfss://path/to/raw/files/*.parquet") 

有没有一种方法可以让上面的语句起作用?

您可以使用Magic命令来使用shell命令来使用通配符语法。

例如,您可以在Databricks单元格中使用:

%sh
ls /dbfs/mnt/mountpoint/path/to/raw/*.parquet

您不能直接在dbutils.fs.ls命令中使用通配符,但是您可以获取目录中的所有文件,然后使用简单的列表推导来过滤出感兴趣的文件。例如,要获取的所有文件的列表结尾感兴趣的扩展:

lst=[c[0] for c in dbutils.fs.ls("abfss://path/to/raw/files/) if c[0].split("/")[-1].endswith(".parquet")]

或者使用正则表达式:

import re
lst=[c.path for c in dbutils.fs.ls("abfss://path/to/raw/files/) if re.search(".parquet$",c.path) is not None]

像这样使用:

path="abfss://path/to/raw/files/*.parquet"
filelist=dbutils.fs.ls(path)
print(filelist)

以上代码将打印给定路径中所有parquet文件的名称。

我最终使用以下代码来实现通过glob模式过滤路径:

import org.apache.hadoop.conf.Configuration
import org.apache.hadoop.fs.{Path, FileSystem}
import org.apache.spark.deploy.SparkHadoopUtil
import org.apache.spark.sql.execution.datasources.InMemoryFileIndex
import java.net.URI
def listFiles(basep: String, globp: String): Seq[String] = {
val conf = new Configuration(sc.hadoopConfiguration)
val fs = FileSystem.get(new URI(basep), conf)
def validated(path: String): Path = {
if(path startsWith "/") new Path(path)
else new Path("/" + path)
}
val fileCatalog = InMemoryFileIndex.bulkListLeafFiles(
paths = SparkHadoopUtil.get.globPath(fs, Path.mergePaths(validated(basep), validated(globp))),
hadoopConf = conf,
filter = null,
sparkSession = spark, areRootPaths=true)
// If you are using Databricks Runtime 6.x and below,
// remove <areRootPaths=true> from the bulkListLeafFiles function parameter.
fileCatalog.flatMap(_._2.map(_.path))
}
val root = ""abfss://path/to/raw/files/"
val globp = "*.parquet" // glob pattern, e.g. "service=webapp/date=2019-03-31/*log4j*"
val files = listFiles(root, globp)
display(files.toDF("path"))

不幸的是,其他建议的答案并没有为我在Databricks工作。因此采用了这种方法。如需详细说明,请参阅此处的源代码。

最新更新