queryrecord处理器在nifi中执行聚合sql函数

w6lpcovy  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(531)

我有以下流程:
querydatabasetable->queryrecord->updateattribute->mergecontent->putelasticsearchhttp
其思想是从数据库中获取记录并对字段执行聚合函数。在我的数据库表中,有以下4个字段:

DeptId  DepartmentName  Address  ExperienNo

1    DS    San Jose      4

2    GT    San Fran      6

3    At    Oakland       8

4    BMS   detroit       3

5    RT    Haawai        9

我将queryrecord的控制器服务设置为avroreader,csvsetwriter的模式如下:

{
"type": "record",
"name": "SQLSchema",
"fields" : [
{"name": "DeptId", "type": "int"},
{"name": "DepartmentName", "type": "string"},
{"name": "Address", "type": "string"},
{"name": "ExperienceNo", "type": "int"},
{"name": "Total_Experience", "type": "int"}
]
}

我想在两个字段上执行差异(deptid experienceno)
我的sql查询如下:

SELECT DeptId, DepartmentName,Address,ExperienceNo,
(DeptId - ExperienceNo) AS Total_Experience FROM flowfile

我明白了 error as 'Total_Experience' cannot be null .
然而,同样的查询在mysql中运行良好。如何实现这一点,我可以在字段上执行sql聚合函数,并将其别名为新的动态列。
谢谢您。
任何建议都非常感谢。

baubqpgj

baubqpgj1#

您的csv读卡器控制器服务配置为 {"name": "Total_Experience", "type": "int"} 字段中没有默认值,并且在输入数据中没有此字段。
所以处理器在抱怨 Total_Experience 不能是 null .
要解决此问题,请更改avro模式,使total\ u experience字段包含空值。
avro架构:

{
"type": "record",
"name": "SQLSchema",
"fields" : [
{"name": "DeptId", "type": "int"},
{"name": "DepartmentName", "type": "string"},
{"name": "Address", "type": "string"},
{"name": "ExperienceNo", "type": "int"},
{"name": "Total_Experience", "type": ["null","int"]}
]
}

csvreader控制器服务配置:

输出:

DeptId,DepartmentName,Address,ExperienceNo,Total_Experience
1,DS,San Jose,4,-3
2,GT,San Fran,6,-4
3,At,Oakland,8,-5
4,BMS,detroit,3,1
5,RT,Haawai,9,-4

正确的方法是:
在创建此字段时,配置没有总经验字段的csv读取器,并在csvsetwriter控制器服务中包含总经验 using Query record 处理器。

相关问题