我有一个流程QueryDatabaseTable-> ConvertRecord-> PutElasticseachHttpRecord 我想要做的是从MySQL数据库中获取完整数据,并将其馈送到Elasticsearch中,以便使用Kibana对它执行分析。但是,我的数据具有重复的列,如下所示:(黑色突出显示是唯一的重复值)
ID,机器名称,value1,Value2,日期
1, abc,10,34 ,2018-09-27 10:40:10
2, abc,10,34 ,2018-09-27 10:41:14
3, abc,10,34 ,2018-09-27 10:42:19
4,xyz,12,45,2018-09-27 10:45:19
因此在我的表ID中,主键和Timestamp字段不断更新。我想要实现的是仅获取特定机器名称的一条记录。下面的示例显示了我想要的输出表:
ID,计算机名称,值1,值2,日期
1,abc,10,34,2018-09-27 10:40:10
4,xyz,12,45,2018-09-27 10:45:19
如何在NiFi中实现这一目标?目的是删除/删除重复的列。如果可以的话,请告诉我要使用哪个处理器以及要设置哪些配置?
任何建议都值得赞赏。 谢谢
答案 0 :(得分:2)
使用 QueryRecord processor ,而不是使用convertrecord
处理器。
使用row_number() window function和Partition by Machine Name,value1,value2...etc
添加新的SQL查询,并在每个分区数据中仅选择第一行。
QueryRecord配置:
我尝试使用Csv reader
和Json set Writer
控制器服务
查询:
select id,machinename,value1,value2,"date" from(
SELECT id,
machinename,value1,value2,"date",
row_number() over (partition by machinename order by "date" asc) as rn
from FLOWFILE
) sq
WHERE rn = 1
输出:
[ {
"id" : "1",
"machinename" : "abc",
"value1" : "10",
"value2" : "34",
"date" : "2018-09-27 10:40:10"
}, {
"id" : "4",
"machinename" : "xyz",
"value1" : "12",
"value2" : "45",
"date" : "2018-09-27 10:45:19"
} ]
流量:
QueryDatabaseTable->QueryRecord->PutElasticseachHttpRecord
如果machine name column name
中有空格,则enclose column name in double quotes("<col_name>")
使用下面的查询
select id,"machine name",value1,value2,"date" from(
SELECT id,
"machine name",value1,value2,"date",
row_number() over (partition by "machine name" order by "date" asc) as rn
from FLOWFILE
) sq
WHERE rn = 1
我在partition by子句中仅包含machine name
列,但您可以根据需要添加其他列value1,value2
。
使用this模板以获取更多参考。