Oracle + NiFi => 所有字段都转换为字符串

Oracle + NiFi => all fields converted to String

我正在使用 NiFi 将 Oracle (11g) 数据库表传输到 HDFS(Avro 格式)。

AVRO 列的输入出现问题:它们都被定义为字符串,即使 Oracle 表列是另一种类型,如数字、时间戳或日期时间。显然,这很烦人:-)

谷歌搜索后,我发现问题存在于某些 Oracle JDBC 驱动程序和 Avro 转换器的组合中。但是,我找不到合适的解决方案;有谁知道要使用什么JDBC(或其他?)驱动程序才能在 Avro 输出中正确输入?

我没有使用 Oracle 的经验来判断哪个驱动程序有效,但为了使其在 NiFi 中正常工作,驱动程序必须支持使用 ResultSetMetaData 来获取列类型:

https://github.com/apache/nifi/blob/ba513447d75dc5e95ddcdfcac1a1fefe2eb175ce/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/util/JdbcCommon.java#L100-L108

听起来您使用的驱动程序正在为每一列返回字符串。

如果驱动程序按照 Bryan 的建议返回 "string" 作为每列的类型(或 NiFi 将其视为字符串的未知类型),那么如果您知道预期的列类型,则用于原始类型转换(string, long, int, double, float) 你可以试试 ConvertAvroSchema 处理器。

对于 date/time 字段,根据您想用它们做什么,NiFi 表达式语言中有一些 Date Manipulation functions 可以帮助您处理它们。

我找到了意外行为的解释:

  1. Oracle 使用 NUMBER,即使该列是用 INT [1] 定义的(这 我猜这不是驾驶员方面的问题。)
  2. 2JDBC 驱动程序将 Number 映射到 BigDecimal
  3. NiFi 实现将 BigDecimal 映射到 String,因为那时, Avro 直到 Avro 1.8.1 才支持 BigDecimal 映射。当前的 NiFi 使用 Avro 1.7.7。使用 Avro 1.8.1,我们可以使用 LogicalType [2] 以更加用户友好的方式映射 BigDecimal 或 Date。
  4. NiFi 项目 [3] 正在努力使用 LogicalType 机制,以便这些数据类型可以映射到更多 适当的数据类型。

换句话说,看来我得等下一个版本解决这个问题了。