【问题标题】:Oracle + NiFi => all fields converted to StringOracle + NiFi => 所有字段转换为字符串
【发布时间】:2017-06-07 21:48:41
【问题描述】:

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

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

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

【问题讨论】:

    标签: apache oracle11g avro apache-nifi


    【解决方案1】:

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

    对于日期/时间字段,取决于您想对它们做什么,NiFi 表达式语言中有一些 Date Manipulation functions 可以帮助您处理它们。

    【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      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 机制,以便这些数据类型可以映射到更多 适当的数据类型。

      换句话说,我似乎必须等待下一个版本修复此问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-13
        • 2021-04-10
        • 2020-01-19
        • 1970-01-01
        相关资源
        最近更新 更多