【问题标题】:Regex in Apache SparkApache Spark 中的正则表达式
【发布时间】:2015-06-03 05:54:41
【问题描述】:

我有一个这样的文本文件:-

这个食谱可以用立式搅拌机制作,也可以用碗、木勺和强壮的手臂手工制作。
如果您使用咸黄油,请省略
本食谱中添加的盐。
百胜
成分
1 1/4 杯通用面粉(160 克)
1/4茶匙盐
1/2茶匙发酵粉
室温下 1/2 杯无盐黄油(1 棒,或 8 汤匙,或 112 克)
1/2 杯白糖(90 克)
1/2 杯深红糖,包装(85 克)
1个大鸡蛋
1茶匙香草精
1/2 茶匙速溶咖啡颗粒或速溶浓缩咖啡粉
1/2 杯切碎的澳洲坚果(3 1/2 盎司,或 100 克)
1/2 杯白巧克力片
方法
1 将烤箱预热至 350°F (175°C)。将面粉、
和发酵粉放入碗中用力搅拌,然后放在一边。

我想提取单词成分和方法之间的数据。
我写了一个正则表达式(?s)(?<=\bIngredients\b).*?(?=\bMethod\b)
提取数据,它工作正常。
但是,当我尝试使用以下 spark-shell 时,它并没有给我任何
任何东西。

val b = sc.textFile("/home/akshat/file.txt")
val regex = "(?s)(?<=\bIngredients\b).*?(?=\bMethod\b)".r
regex.findAllIn(b).foreach(println)

请告诉我哪里出错了,我应该采取什么步骤
改正了吗?
提前致谢!

【问题讨论】:

  • b 是一个 RDD,regex.findAllIn 适用于字符串。因此,您需要将正则表达式应用于 RDD 集合的字符串。可能是mapflatmap

标签: regex scala apache-spark pattern-matching


【解决方案1】:

你需要做的是

  1. 使用 WholeTextFiles 读取文件(因此它不会换行,您可以一起读取整个数据)
  2. 编写一个函数,该函数接受一个字符串并使用该正则表达式输出一个字符串 所以,它可能看起来像(在 python 中)

块引用

def getWhatIneed(s):
    output = <my regexp>
    return output

b = sc.WholeTextFiles(...)
c = b.map(getWhatIneed)

现在,c 也是一个 RDD。您需要在打印之前收集它。 collect 的输出是一个普通的数组/列表

print c.collect()

【讨论】:

  • 问题是定义的函数中的输出应该返回你告诉的字符串,但正则表达式的类型是 scala.util.matching.regex 所以它给出了类型不匹配错误。在这种情况下,我的方法应该是什么?
  • 这是一个 Scala 正则表达式问题。无论如何,我不是这方面的专家。通过查找 scala api 文档,您似乎需要将字符串传递给正则表达式实例,然后使用 findAllMatchIn 等方法提取输出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-04
  • 2023-03-17
  • 2011-11-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-09
相关资源
最近更新 更多