我有followimg流程:
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和CSVSetWritter,并具有以下模式:
{
"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聚合功能,并将其作为新的 dynamic 列。
谢谢。
任何建议都值得赞赏。
答案 0 :(得分:2)
您的 csv阅读器控制器服务已配置
{"name": "Total_Experience", "type": "int"}
字段没有默认值,并且在输入数据中没有得到该字段。
因此处理器正在抱怨 Total_Experience
不能是null
。
要解决此问题,请更改 avro模式,以在 Total_Experience 字段中添加 null 值。
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阅读器而没有 Total_Experience 字段,
通过using Query record
处理器创建此字段时,在 CsvSetWriter 控制器服务中包括 Total_Experience 。