在目标表上使用具有不同列名的PutDatabaseRecord迁移表

时间:2019-05-31 19:39:52

标签: apache-nifi

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

db2表: NROCTA,NUMRUT,DIASMORA2

MSSQL表: NROCTA,NUMRUT,DIAMORAS

您看到DIAMORAS有所不同。

我使用以下流程:

ExecuteSQL-> SplitAvro-> PutDatabaseRecord

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

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

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

谢谢!

1 个答案:

答案 0 :(得分:0)

第一件事,除非您尝试将某些逻辑行的行作为单个事务发送,否则您的流程中可能根本不需要SplitAvro。

要更改列名,请使用UpdateRecord并将字段/DIASMORAS设置为记录路径/DIASMORA2,然后将AvroRecordSetWriter架构中的字段名称从DIASMORA2更改为{{ 1}}。

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

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