【问题标题】:Migrating table with PutDatabaseRecord with different column name at the target table在目标表中使用具有不同列名的 PutDatabaseRecord 迁移表
【发布时间】:2019-06-05 02:23:27
【问题描述】:

我需要将数据从 db2 表迁移到 mssql 表,但其中一列的名称不同,但数据类型相同。

Db2 表: NROCTA,NUMRUT,DIASMORA2

MSSQL 表: NROCTA、NUMRUT、DIAMORAS

如您所见,DIAMORAS 与众不同。

我使用以下流程:

ExecuteSQL -> SplitAvro -> PutDatabaseRecord

在 PutDataBaseRecord 中,我有一个以这种方式配置的 AvroReader 作为 RecordReader:

架构访问策略:使用嵌入式 Avro 架构。 架构文本:${avro.schema}

流程只插入前两列。¿如何在 DIASMORA2 和 DIAMORAS 列之间进行映射?

提前致谢!

【问题讨论】:

    标签: apache-nifi


    【解决方案1】:

    首先,您的流程中可能根本不需要 SplitAvro,除非您尝试将某些行的逻辑子集作为单独的事务发送。

    对于列名更改,使用 UpdateRecord 并将字段 /DIASMORAS 设置为记录路径 /DIASMORA2,并将 AvroRecordSetWriter 架构中的字段名称从 DIASMORA2 更改为 DIASMORAS

    最后一部分有点棘手,因为您在 AvroReader 中使用嵌入式模式。如果架构始终相同,您可以停止 UpdateRecord 处理器并放入 ExtractAvroMetadata 处理器以提取 avro.schema 属性。这会将嵌入的模式放入流文件的avro.schema 属性中。

    然后在启动 UpdateRecord 之前,启动 ExecuteSQL 和 ExtractAvroMetadata 处理器,然后检查队列中的流文件以将架构复制出 avro.schema 属性。然后在 ConvertRecord 中的 AvroRecordSetWriter 中,您可以选择 Use Schema Text,而不是继承架构,然后从属性中粘贴架构,将 DIASMORA2 更改为 DIASMORAS。这种方法将来自DIASMORA2 字段的值放入DIASMORAS 字段,但由于DIASMORA2 不在输出模式中,它被忽略,从而有效地重命名该字段(尽管在后台它是一个复制和-删除)。

    【讨论】:

    • 感谢 mattyb 的回答!我正在使用SplitAvro(输出大小= 1),因为如果有一些记录导致插入错误,则不会插入任何记录,甚至不会插入好的记录(还有其他方法可以解决这个问题吗?)。但是,将 PutDataBaseRecord 与 SplitAvro 一起使用效率较低,需要更长的时间。我可以在查询“select DIASMORA2 AS DIAMORAS”中解决我的问题,因此 avro 架构与表中的列名完美匹配。
    猜你喜欢
    • 1970-01-01
    • 2022-10-14
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2016-12-16
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    相关资源
    最近更新 更多