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

时间:2017-01-23 11:34:37

标签: apache oracle11g avro apache-nifi

我使用NiFi将Oracle(11g)数据库表格转换为HDFS(Avro格式)。

AVRO列的输入出了问题:它们都被定义为String,即使Oracle表列是另一种类型,如Numeric,Timestamp of Datetime。显然,这很烦人: - )

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

3 个答案:

答案 0 :(得分:2)

如果司机正在返回"字符串"作为Bryan建议的每列的类型(或NiFi视为字符串的未知类型),如果您知道预期的列类型,对于基本类型转换(字符串,long,int,double,float),您可以尝试ConvertAvroSchema处理器。

对于日期/时间字段,根据您对它们的喜好,NiFi表达式语言中有一些Date Manipulation functions可以帮助您处理它们。

答案 1 :(得分:1)

我没有使用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

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

答案 2 :(得分:0)

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

  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 机制,以便可以映射更多的数据类型 适当的数据类型。
  5. 换句话说,似乎我必须等待修复此问题的下一个版本。