Pentaho 数据集成输入/输出位类型错误

Posted

技术标签:

【中文标题】Pentaho 数据集成输入/输出位类型错误【英文标题】:Pentaho Data Integration Input / Output Bit Type Error 【发布时间】:2015-10-20 16:06:01 【问题描述】:

我在工作中的许多项目中都使用 Pentaho 数据集成。我们主要使用 Postgres 作为我们的数据库。我们的一张旧表有两列设置为类型 bit(1) 以存储 0 表示 false 和 1 表示 true。

我的任务是在我们的开发环境中将生产表与副本同步。我正在使用表格输入读取数据并立即尝试进行插入/更新。但是,由于 PDI 转换为布尔值,它失败了。我更新了查询以将值转换为整数以保留 0 和 1,但是当我再次运行它时,我的转换失败,因为整数不能是位值。

我已经寻找了几天尝试不同的方法,例如使用 javascript 步骤转换为位,但我无法成功读取位类型并使用插入/更新步骤来存储数据。我也不相信插入/更新步骤具有更新用于定义列数据类型的 SQL 的功能。

数据库连接使用:

连接类型:PostgreSQL 访问:本机 (JDBC) 支持布尔数据类型:true 引用数据库中的所有内容:true

注意:此时更改表以更改数据类型不是可选的。目前有太多应用程序依赖于此表,因此以这种方式更改它可能会导致不良影响

任何帮助将不胜感激。谢谢。

【问题讨论】:

... is not optional at this point in time. Too many applications currently depend on this table so altering it in this way could cause undesirable affects 您是否考虑过用 VIEW 模拟 old 行为? (如果数据仅用于只读,则容易;否则更难) 我在 PDI 和 mysql 中遇到过这种情况。相同的用例,在表输入后立即插入/更新。 MySQL 的解决方案是cast(bit_column_name AS signed)。但是,我只是用 PostgreSQL 9.3 数据库和 PDI 5.4-stable 对其进行了测试,无论如何都不需要强制转换。您能否添加源表和目标表以及您运行的 PDI 版本的部分 DDL? 【参考方案1】:

您可以使用“作为分配”选项在目标数据库中创建转换对象(例如从字符变化到位)。 ASSIGNMENT 允许在插入期间自动应用此铸件。 http://www.postgresql.org/docs/9.3/static/sql-createcast.html

这里有一些概念验证:

CREATE FUNCTION cast_char_to_bit (arg CHARACTER VARYING) 
    RETURNS BIT(1) AS
$$
    SELECT
    CASE WHEN arg = '1' THEN B'1'
        WHEN arg = '0' THEN B'0'
        ELSE NULL
    END
$$
LANGUAGE SQL;

CREATE CAST (CHARACTER VARYING AS BIT(1)) 
WITH FUNCTION cast_char_to_bit(CHARACTER VARYING) 
AS ASSIGNMENT;

现在您应该能够将单字符串插入/更新到 bit(1) 列中。但是,您需要将输入列转换为字符变化/文本,以便在表输入步骤之后将其转换为字符串,并在插入/更新步骤中将其转换为 CHARACTER VARYING。

也许,您可以使用现有的转换函数创建转换对象,这些转换函数已经在 postgres 中定义(参见 pg_cast、pg_type 和 pg_proc 表,通过 oid 连接),但很遗憾,我没有做到这一点。

编辑 1: 抱歉之前的解决方案。添加从布尔到位的转换看起来更合理:您甚至不需要在表输入步骤中转换数据。

CREATE FUNCTION cast_bool_to_bit (arg boolean) 
    RETURNS BIT(1) AS
$$
    SELECT
    CASE WHEN arg THEN B'1'
        WHEN NOT arg THEN B'0'
        ELSE NULL
    END
$$
LANGUAGE SQL;

CREATE CAST (BOOLEAN AS BIT(1)) 
WITH FUNCTION cast_bool_to_bit(boolean) 
AS ASSIGNMENT;

【讨论】:

【参考方案2】:

我通过在上一步中写出 Postgres 插入 SQL(位值使用 B'1' 和 B'0')并在最后使用“执行行 SQL 脚本”将每个插入单独运行来解决了这个问题SQL 语句。

【讨论】:

以上是关于Pentaho 数据集成输入/输出位类型错误的主要内容,如果未能解决你的问题,请参考以下文章

从 Pentaho 数据集成连接到 MongoDB

Pentaho 数据集成 从数据库导入大型数据集

Pentaho 数据集成 (PDI):将布尔值从源插入到目标

Pentaho 中的 Hive 数据集成错误

Pentaho 数据集成:错误处理

从结果集中获取行并在 Pentaho 数据集成中使用获取变量