2017-10-04 147 views
1

我有多個文本文件要用JavaSparkContext讀取,並且每個文件可能略有不同,並且包含多行記錄,所以我想使用正則表達式分隔符來查找記錄。是否可以使用正則表達式來配​​置textinputformat分隔符?是否可以使用正則表達式作爲textSpringContext的textinputformat分隔符?

.. 
String regex = "^(?!(^a\\s|^b\\s))"; 
JavaSparkContext jsc = new JavaSparkContext(conf); 
jsc.hadoopConfiguration().set("textinputformat.record.delimiter", regex); 
.. 

回答

1

不幸的是,它不是。 textinputformat.record.delimiter必須是修復模式。與Spark一起工作時,您必須選擇:

  • 實現您自己的Hadoop輸入格式 - 縮放比較好,但需要更多工作。
  • 使用wholeTextFiles(或binaryFiles)和使用正則表達式拆分字符串 - 易於使用,但不能擴展到大型文件。
0

是的,它會工作。但它會爲分隔符創建一個新行。我已經創建了一個小程序來測試它。 RDD的大小是3

val conf = new SparkConf() 
    .setAppName("AppMaster") 
    .setMaster("local") 
val sc = new SparkContext(conf) 
val regex = ":::" 
sc.hadoopConfiguration.set("textinputformat.record.delimiter",regex) 

val rdd = sc.textFile("/home/kishore/del.txt") 

rdd.foreach{ 
    e => println(e) 
} 

輸入

foo 
bar 
foo bar ::: 
foo 
bar 
foo bar ::: 

輸出

foo 
bar 
foo bar 

foo 
bar 
foo bar 

所以在這種情況下,上述第3行考慮爲單線。

+1

這個答案是錯誤的,實際上它解析了「:::」匹配字符而不是正則表達式的原因,而新行僅僅是因爲「println」。 –

相關問題