2015-06-03 42 views
1

我有讀這樣的一個文本文件: -正則表達式在Apache中星火

這個配方,可無論用臺式攪拌機,或通過手碗,
木勺,和強大的武器。如果您使用鹽漬黃油,請在此配方中省略
加鹽。

成分
1 1/4杯通用麪粉(160 G)
1/4茶匙鹽
1/2茶匙發酵粉
1/2杯無鹽黃油(1個棒,或8大勺,或112克)在室溫下
1/2杯白砂糖(90 G)
1/2杯棕糖,包裝(85 G)
1大蛋
1茶匙香草提取物
1/2茶匙速溶咖啡顆粒或速溶咖啡粉
1/2杯切碎的澳大利亞堅果(3 1/2盎司或100克)
1/2杯白巧克力片
方法
1將烤箱預熱至175°C(350°F)。大力將麪粉,
和發酵粉放在一個碗中,並放在一邊。

我想提取單詞Ingredients和Method之間的數據。
我寫了一個正則表達式(?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) 

請告訴我,我錯了,我應該採取什麼措施來
糾正呢?
在此先感謝!

+0

'B'是RDD,'regex.findAllIn'適用於字符串。因此,您需要將正則表達式應用於RDD集合的字符串。可能是像'map'或'flatmap'這樣的問題 – maasg

回答

1

你需要做的是

  1. 使用WholeTextFiles讀取文件(所以它不會破壞線條和你一起閱讀整個數據)
  2. 寫一個函數,它接受一個字符串,並使用輸出字符串該正則表達式 因此,它可能看起來像(在python)

塊引用

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

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

現在,c也是一個RDD。您需要在打印之前收集它。的收集輸出是正常的陣列/列表

print c.collect() 
+0

問題是定義的函數中的輸出應該返回一個字符串,正如你所說的那樣,但是regexp的類型是scala.util.matching.regex,所以它給出了一個類型不匹配的錯誤。 在這種情況下,我應該怎麼做? –

+0

這是一個斯卡拉正則表達式問題。無論如何,我不是那方面的專家。通過查找scala api文檔,似乎需要將字符串傳遞給正則表達式實例,然後使用findAllMatchIn之類的方法提取輸出。 –