2017-10-04 51 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”。 –

相关问题