nifi中的mysql命名约定

y0u0uwnf  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(482)

我有一个流getfile->convertrecord->splittext->putdatabaserecord。我发送到getfile的csv文件包含以下字段:

ID  TIME                      M00B01  M00B02  M00B03
1   2018-09-27 10:44:23.972   3242    35      335
2   2018-09-21 11:44:23.972   323     24      978

我在mysql中的数据库表 backbone 如下:

Create table test(ID INT,TIME DATETIME(3),MxB01 INT,MxB02 INT,MxB03 INT);

注意:我已将标头的名称替换为mxb00、mxb01等。。
我的convertrecord处理器出错,因为我以csvreader的身份读取,以csvsetwritter的身份写入。我附上两者的配置供您参考。
问题是它读取csv文件,但由于头名称的更改,它将所有其他字段都设置为空(我更改了头名称,因为我必须将头名称写为mxb00,以便匹配mysql表中定义的头)。我得到id和time的值,因为我没有更改csvwriter和mysql表定义中那些字段的头名称。所以这些值我得到了,但是对于其他值我得到了空白,因为它由于名称的改变而变得混乱。



我怎样才能解决这个问题?非常感谢您的帮助。谢谢!

kiz8lqtg

kiz8lqtg1#

尝试getfile->replacetext->convertrecord->splittext->putdatabaserecord。
配置:
搜索值:输入标题,替换值:新建标题,替换策略:文字替换,评估模式;整个文本

xxhby3vn

xxhby3vn2#

当您要为输出csv文件创建自定义头文件时,请按如下所示配置csv reader controller服务。
配置:

因为我们使用模式访问策略作为模式文本,并将模式作为

{
"type": "record",
"name": "SQLSchema",
"fields" : [
{"name": "ID", "type": ["null","int"]},
{"name": "TIME", "type": ["null","string"]},
{"name": "MxB01", "type": ["null","int"]},
{"name": "MxB02", "type": ["null","int"]},
{"name": "MxB03", "type": ["null","int"]}
]
}

我们将csv数据的第一行作为头,忽略csv头列名,因此输出流文件将具有上面定义的模式。
csvwriter配置:

因为我们继承了模式写入策略,所以输出流文件的头将与我们在读取器中指定的头相同。
此外,我不知道为什么在convertrecord之后使用splittext处理器作为putdatabaserecord处理器,设计为一次处理记录块。
即使您可以使用上面提到的csvreader controller服务配置putdatabaserecord处理器,您的流程也将是:
流量:

GetFile -> PutDatabaseRecord

注:
由于我没有将avro逻辑类型用于timestamp字段,如果您使用的是逻辑类型,则相应地更改控制器服务配置。

相关问题