【问题标题】:Apache spark to read files as regexApache spark以正则表达式读取文件
【发布时间】:2017-04-26 14:15:55
【问题描述】:

我正在向 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 文件。我尝试使用正则表达式

hdfs://myip:9000/travel/FlumeData.[0-9]* hdfs://myip:9000/travel/FlumeData.//d*

但他们不工作。我正在寻找这样的东西 jssc.fileStream("hdfs://myip:9000/travel/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();
   } 

但它的文件系统对象 fs 没有文件名()。由于新文件是在运行时创建的。我需要阅读他们创建的内容。

【问题讨论】:

    标签: regex hadoop apache-spark spark-streaming


    【解决方案1】:

    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);
    

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

    【讨论】:

      【解决方案2】:

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

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

      FlumeData.1234 from FlumeData.1234.tmp 
      

      为此,您需要的简单正则表达式是:

      (.*).tmp
      

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

      【讨论】:

      • 我尝试使用选择器但得到了这个异常 java.io.FileNotFoundException: File hdfs://myIP:9000/FlumeData.([0-9])* 不存在。它读作文本而不是正则表达式。我还更新了我的实际查询。
      • 可能它不接受正则表达式作为参数的一部分,我认为你的问题基本上是你不知道你想要流的文件的名称,对吧?也许您可以列出 hdfs://myip:9000/travel/ 上的文件并使用正则表达式过滤它们的名称,然后检索您想要的文件?
      • 我添加了更多代码。请帮助获取文件名。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-12
      相关资源
      最近更新 更多