NiFi中的命名约定

时间:2018-11-02 22:34:39

标签: mysql apache etl apache-nifi

我有一个流程 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中的MY数据库表骨架如下:

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

注意:我已将标头的名称替换为MxB00,MxB01等。

当我以CSVReader的形式读取并以CSVSetWritter的形式写入时,convertRecord处理器中出现错误。我附上两者的配置供您参考。

问题是它读取CSV文件,但是由于标头名称的更改,它会将所有其他字段都留为空白(我更改了标头名称,因为我必须将标头名称写为MxB00才能匹配MySQL中定义的标头表)。我获得了ID和Time的值,因为我没有更改CSVWritter和MySQL表定义中那些字段的Header名称。所以我得到的那些值,但对于其他值我却是空白的,因为名称更改使它变得混乱。

CSVReader

CSVSetWritter

AvroSchemaRegistry

如何解决此问题?非常感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

您要为输出CSV文件创建自定义标头,然后配置 CSV阅读器控制器服务,如下所示。

配置: enter image description here

由于我们将“模式访问策略”用作“模式文本”,并将模式指定为

{
"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配置:

enter image description here 由于我们继承了架构写入策略,因此输出流文件将具有与在阅读器中指定的相同的标头。

此外,我不确定您为什么在ConvertRecord之后使用SplitText处理器作为旨在一次处理大块记录的PutDatabaseRecord处理器。

即使您可以使用上述 CsvReader控制器服务配置 PutDatabaseRecord 处理器,您的流程也将是:

流量:

GetFile -> PutDatabaseRecord

注意:

如果您使用的是逻辑类型,因为我没有在时间戳字段中使用Avro逻辑类型,请相应地更改控制器服务配置。

答案 1 :(得分:0)

尝试GetFile-> ReplaceText-> ConvertRecord-> splittext-> PutdatabaseRecord。

config:

搜索值:输入标题, 替换值:新标题 替换策略:文字替换, 评估模式;整个文字