【问题标题】:How to use ConvertRecord and CSVRecordSetWriter to output header (with no data) in Apache NiFi?如何使用 ConvertRecord 和 CSVRecordSetWriter 在 Apache NiFi 中输出标头(无数据)?
【发布时间】:2018-09-14 05:29:59
【问题描述】:

我正在使用 Apache NiFi 从数据库表中提取数据,并使用 ConvertRecord 使用 AvroReaderCSVRecordSetWriter 将获取的记录从 avro 更改为 CSV 文件。

当至少有一行从数据库返回时,我的流程运行良好。

但是,当ExecuteSQL 处理器输出包含 0 条记录的流文件时(流文件仍然包含元数据/avro 模式)-ConvertRecord 给我一个 0 字节的流文件输出。我在CSVRecordSetWriter服务中的设置设置为输出header。

在这种情况下,有没有办法让ConvertRecord 输出一个只包含标题行的流文件?

【问题讨论】:

  • 一个问题:ExecuteSQL -> CovertRecord 很好,但你可以使用QueryDatabaseRecord 代替吗,因为它将两者结合在一起?

标签: csv apache-nifi


【解决方案1】:

ExecuteSql 处理器将 executesql.row.count(Contains the number of rows returned in the select query) 属性添加到流中。

您可以检查attribute(executesql.row.count) 的值并决定我们是否需要使用ConvertRecord 处理器。

流程:

Executesql(success)--> RouteOnAttribute(add new property ${executesql.row.count:equals(0)}) 
     --> matched --> ReplaceText //Add Header
     --> unmatched --> ConvertRecord //convert to csv format

如果匹配然后使用ReplaceText处理器覆盖现有的流文件内容与标题。

如果 Unmatched 表示您在流文件内容中有一些数据行,因此请使用 ConvertRecord 处理器 并准备 csv 数据。

【讨论】:

  • NiFi 1.8.0(通过 NIFI-5382)的 ConvertRecord 中将提供相同的功能。
  • @mattyb 我在看,但不是 100% 清楚它是否会填充该标题
  • 我考虑过这样的方法,我想让事情更接近查询(因为我在模板情况下有很多);作为一种“解决方法”,我最终使用 UNION SELECT null 作为“Foo”模式,然后用ReplaceText 进行正则表达式替换。一些额外的工作,但似乎工作。我期待 1.8.0 看看这是否能简化这一点。
  • @Shu 当您说“带有标题的内容”时,您是说替换文本是标题的静态字符串,还是有一些巧妙的方法可以将 Avro 架构元数据外推为符合 CSV 的分隔格式?
  • @thinice 一种方法是使用标头的静态字符串(或)另一种方法是使用 ExtractAvroMetaData 处理器 并从avro 数据文件然后使用 ReplaceText 具有 avro.schema 值的流文件的内容。第二种方式是动态的,基于 avro 数据文件的 avro.schema Metadata Keys
猜你喜欢
  • 2019-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-18
  • 1970-01-01
  • 2019-06-20
  • 2021-11-26
相关资源
最近更新 更多