使用Apache NiFi对Postgres表进行加载时,UUID数据类型存在问题

时间:2018-08-06 12:59:38

标签: postgresql uuid avro apache-nifi

数据库

  • Postgres 9.6
  • 包含几个具有UUID列的表(包含每个记录的ID)

NiFi

  • 最新版本(1.7.1)
  • 使用Avro 1.8.1(据我所知)

问题描述

使用ExecuteSQL处理器调度表时,会出现以下错误消息:

  

ExecuteSQL [id = 09033e32-e840-1aed-3062-6e8cbc5551ba] ExecuteSQL [id = 09033e32-e840-1aed-3062-6e8cbc5551ba]由于createSchema无法处理会话:未知的SQL类型1111 / uuid(表:国家/地区, column:id)不能转换为Avro类型;可管理地产生1秒钟的处理器:java.lang.IllegalArgumentException:createSchema:未知的SQL类型1111 / uuid(表:国家/地区,列:id)无法转换为Avro类型

请注意,流文件不会从传入队列中删除,也不会发送到“失败”关系,从而导致失败尝试的无休止循环。

尝试解决问题

  • 我尝试启用ExecuteSQL处理器的 Use Avro Logical Types 属性,但是发生了相同的错误。

可能但不是首选的解决方案

  • 我目前在每个表中执行SELECT *。一种可能的解决方案(我认为)是指定每个列,并使查询将uuid转换为字符串。尽管这可行,但我强烈希望不必分别列出每一列。

最后的记录

2 个答案:

答案 0 :(得分:1)

我相信UUID不是标准的JDBC类型,而是特定于Postgres。

JDBC类型类显示SQL类型1111为“ OTHER”:

 /**
     * The constant in the Java programming language that indicates
     * that the SQL type is database-specific and
     * gets mapped to a Java object that can be accessed via
     * the methods <code>getObject</code> and <code>setObject</code>.
     */
        public final static int OTHER           = 1111;

所以我不确定NiFi怎么知道在这里做什么,因为它可能取决于DB的类型。

答案 1 :(得分:0)

您是否尝试过创建将列定义为:: text的视图?

SELECT
    "v"."UUID_COLUMN"::text AS UUID_COLUMN
FROM
...