如何使用正则表达式在 sc.textFile 中包含/排除某些输入文件?

问题描述 投票:0回答:2

我尝试使用文件内的 Apache Spark 过滤出特定文件的日期到 RDD 函数

sc.textFile()

我尝试执行以下操作:

sc.textFile("/user/Orders/201507(2[7-9]{1}|3[0-1]{1})*")

这应该与以下内容匹配:

/user/Orders/201507270010033.gz
/user/Orders/201507300060052.gz

知道如何实现这一目标吗?

scala apache-spark
2个回答
76
投票

查看已接受的答案,它似乎使用了某种形式的 glob 语法。它还揭示了该API是Hadoop的暴露

FileInputFormat

搜索显示提供给

FileInputFormat
addInputPath
setInputPath
的路径“可能代表一个文件、一个目录,或者通过使用 glob,代表文件和目录的集合”。也许,
SparkContext
也使用这些API来设置路径。

glob语法包括:

  • *
    (匹配0个或多个字符)
  • ?
    (匹配单个字符)
  • [ab]
    (角色类)
  • [^ab]
    (否定字符类)
  • [a-b]
    (字符范围)
  • {a,b}
    (交替)
  • \c
    (转义字符)

按照已接受答案中的示例,可以将您的路径写为:

sc.textFile("/user/Orders/2015072[7-9]*,/user/Orders/2015073[0-1]*")

不清楚这里如何使用交替语法,因为逗号用于分隔路径列表(如上所示)。根据zero323的评论,不需要转义:

sc.textFile("/user/Orders/201507{2[7-9],3[0-1]}*")

0
投票

我尝试了上面的方法。我在 GCS 中有 dept_27 和 dept 29 文件夹。我尝试了 dept[27,29] ,但它对我不起作用,因为我相信它会将其视为字面意思并寻找 2,7,9 文件夹。我尝试了 dept{27,29} ,但即使这样也对我不起作用。有人可以建议如何从 GCS 阅读此内容吗?

© www.soinside.com 2019 - 2024. All rights reserved.