自定义nifi处理器 - 写入流文件

时间:2017-05-28 15:25:46

标签: java scala apache-nifi

我想创建一个自定义NiFi处理器,它可以读取ESRi ASCII grid files并返回CSV表示,每个文件包含一些元数据,WKT格式包含地理参考用户数据。

不幸的是,解析后的结果不会被写回更新的流文件。

https://github.com/geoHeil/geomesa-nifi/blob/rasterAsciiGridToWKT/geomesa-nifi-processors/src/main/scala/org/geomesa/nifi/geo/AsciiGrid2WKT.scala#L71-L107是我尝试在NiFi中实现这一目标。

不幸的是,只返回原始文件。转换后的输出不会保留。

尝试对其进行修改以手动序列化某些CSV字符串,例如:

  val lineSep = System.getProperty("line.separator")
  val csvResult = result.map(p => p.productIterator.map{
    case Some(value) => value
    case None => ""
    case rest => rest
  }.mkString(";")).mkString(lineSep)

  var output = session.write(flowFile, new OutputStreamCallback() {
    @throws[IOException]
    def process(outputStream: OutputStream): Unit = {
      IOUtils.write(csvResult, outputStream, "UTF-8")
    }
  })

仍然没有写入萤火虫。上面的问题仍然存在,或者我得到StreamStream的Stream not closed例外。

它必须是一点点缺失,但我似乎无法找到遗漏的位。

1 个答案:

答案 0 :(得分:4)

每个更改流文件的会话方法(如session.write())都会返回新版本的文件,您必须传输此新版本。

如果在converterIngester()函数中更改文件,则必须将此新版本返回给调用者函数以转移到关系。