Apache激发读取文件作为正则表达式

时间:2016-03-03 07:55:28

标签: regex hadoop apache-spark spark-streaming

我正在向HDFS发送流并尝试使用spark读取文本文件。

JavaStreamingContext jssc = new JavaStreamingContext(jsc, new    
 Duration(1000));
JavaPairInputDStream<LongWritable, Text> textStream =   
jssc.fileStream("hdfs://myip:9000/travel/FlumeData.[0-9]*", 
LongWritable.class, Text.class, TextInputFormat.class);

在向hdfs发送流时,会创建一些FlumeData.1234.tmp文件,一旦收到完整数据,该文件将转换为适当的文件,例如。 FlumeData.1234

我想忽略这个.tmp文件来读取。来自spark。我尝试使用正则表达式

HDFS:// MYIP:9000 /行程/ FlumeData [0-9] * HDFS:// MYIP:9000 /行程/ FlumeData .// d *

但他们没有工作。我正在寻找这样的东西 jssc.fileStream( “HDFS:// MYIP:9000 /行程/ FlumeData [0-9] *”,     LongWritable.class,Text.class,TextInputFormat.class);

fileStream不应该从文件扩展名读取.tmp。

我还尝试使用Hadoop代码来检索苍蝇列表

private  String pathValue(String PathVariable) throws IOException{



      Configuration conf = new Configuration();
      Path path = new Path(PathVariable);
      FileSystem fs = FileSystem.get(path.toUri(), conf);
      System.out.println("PathVariable" + fs.getWorkingDirectory());

      return fs.getName();
   } 

但它的FileSystem对象fs没有filename()。由于新文件是在运行时创建的。我需要在创建时阅读。

2 个答案:

答案 0 :(得分:0)

您需要使用()选择器选择您可以保持匹配的部分。如果您未指定任何部分,则返回整个匹配。

在你的情况下,如果我没有误会你想在你的例子中选择:

<!DOCTYPE html>
<html ng-app="timer_module">

<head>
  <meta charset="utf-8"></meta>
  <link rel="stylesheet" href="https://bootswatch.com/superhero/bootstrap.min.css"></link>
</head>

<body ng-controller="TimerController as controller">

  {{"D:" + controller.days + " H:" + controller.hours + " M:" + controller.minutes + " S:" + controller.seconds}}

  <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.9/angular.js"></script>
</body>

</html>

要做到这一点,你需要的简单正则表达式是:

FlumeData.1234 from FlumeData.1234.tmp 

如果你想在.tmp扩展名之前选择所有内容。

答案 1 :(得分:0)

JavaPairInputDStream重载的fileStream方法采用过滤函数,我们可以编写一个过滤函数来过滤掉目录中的文件。

fileStream(directory, kClass, vClass, fClass, filter, newFilesOnly)

JavaPairInputDStream<LongWritable, Text> lines = jssc.fileStream("hdfs://myip:9000/travel/", LongWritable.class, Text.class, TextInputFormat.class, new Function<Path,Boolean> () {
        public Boolean call(Path path) throws Exception {
            System.out.println("Is path :"+path.getName());
            Pattern pattern =  Pattern.compile("FlumeData.[0-9]*");
            Matcher m = pattern.matcher(path.getName());
            System.out.println("Is path : " + path.getName().toString() + " matching "
                + " ? , " + m.matches());
            return  m.matches();
        }}, true);

请使用上面的代码运行,我希望这将解决问题。