【问题标题】:scala - iterate over files in directory and get file name that match a specific string in directory?scala - 遍历目录中的文件并获取与目录中特定字符串匹配的文件名?
【发布时间】:2021-04-27 10:21:55
【问题描述】:

我有一个目录,其中的文件看起来像 abc_00_00.csv , abc_001_00.csv , abc_002_00.csv, def_00_00.csv

我只想要那些匹配用户输入的文件,我正在尝试下面的方法,但它在 spark 中不起作用

new File("dbfs:/s3path").listFiles.filter(_.getName.startsWith("abc_*")).foreach(println)

错误

java.lang.NullPointerException

spark 中有什么方法可以让我在 foo 循环中迭代匹配文件吗?

【问题讨论】:

  • 您的目录不存在。此外,您不希望在 startsWith 中使用星号,只需 startsWith("abc_")
  • 对不起,我没有检查本地目录,我正在搜索 s3 路径
  • File 不适用于 s3。为此,您需要一个 aws 客户端。无论如何,您获得 NPE 的原因是因为目录不存在:.listFiles 在这种情况下返回 null。

标签: scala apache-spark


【解决方案1】:

您的问题是该文件夹可能不存在,并且您没有以 abc_* 开头的元素,此处不允许使用通配符。所以请尝试:

new File("C:/dir/").listFiles.filter(_.getName.startsWith("abc_")).foreach(println)

如果发现问题,说明你的目录不存在,可能是小写的c:,试试大写看看dir是否存在

为了确定,我会考虑检查目录是否存在如下:

val directory = new File("C:/dir/")

if (directory.exists && directory.isDirectory) {
   directory.listFiles.filter(_.getName.startsWith("abc_")).foreach(println)
}

【讨论】:

  • 感谢@SCouto 的回复......我的目录在 s3 路径中,我有检查
  • new File("dbfs:/spath").listFiles.filter(.getName.startsWith("abc*")).foreach(println)
  • dbfs 不是 s3,它应该是 "s3a://..." ..,你还有通配符 (*),请删除它
  • S3 完全不同。检查这个答案:stackoverflow.com/questions/17342061/list-files-on-s3
猜你喜欢
  • 2023-03-23
  • 1970-01-01
  • 2019-01-16
  • 2019-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-04
  • 2021-01-04
相关资源
最近更新 更多