在 Apache NiFi 中转换日期
Convert dates in Apache NiFi
这个问题是基于我的旧问题:。
我使用了带有自定义 CSVReader
和 CSVRecordSetWriter
服务的解决方案。几天前,我注意到带有日期的字段可以包含无效的日期格式,例如可以使用值 0
而不是日期 1/29/2020 3:00:00 AM
。因此,UpdateRecord
处理器无法解析此 csv:
AdvertiserID,CampaignStartDate,CampaignEndDate,CampaignName
10730729,1/29/2020 3:00:00 AM,2/20/2020 3:00:00 AM,Nestle
40376079,0,4/1/2020 3:00:00 AM,Heinz
...
我决定在没有自定义 CSV
服务的情况下使用 UpdateRecord
并像这样更新日期格式:
/CampaignStartDate ${field.value:equals('0'):ifElse('null', ${field.value:toDate("MM/dd/yyyy hh:mm:ss a"):format("yyyy-MM-dd"))}
所以,我想将 if-else
逻辑放入 UpdateRecord
处理器中。但是我遇到了两个问题:
- 它把
null
写成字符串,但数据类型应该是null
。
- 它将
${field.value:toDate("MM/dd/yyyy hh:mm:ss a"):format("yyyy-MM-dd"))
写为字段值
结果是:
AdvertiserID,CampaignStartDate,CampaignEndDate,CampaignName
10730729,${field.value:toDate("MM/dd/yyyy hh:mm:ss a"):format("yyyy-MM-dd")),2/20/2020 3:00:00 AM,Nestle
40376079,null,4/1/2020 3:00:00 AM,Heinz
...
对于这种情况,我如何在 Apache NiFi 中实现 if/else 逻辑?
更新
我解决了问题 #2:
${field.value:equals('0')
:ifElse(
'null',
${field.value:replace(${field.value},${field.value:toDate('M/dd/yyyy hh:mm:ss a'):format('yyyy-MM-dd')})}
)}
但是问题 #1 仍然存在。因为我无法将 null
(它写为字符串)保存到 date
类型的数据库列。它returns:
ERROR: invalid input syntax for type date: "null" Where: COPY null_place_report_8246a29a_f620_4333_97f5_e47, row 62, column campaign_start_date: "null"
更新 #2
已解决问题 #1。将表达式更改为:
${field.value:equals('0')
:ifElse(
'',
${field.value:replace(${field.value},${field.value:toDate('M/dd/yyyy hh:mm:ss a'):format('yyyy-MM-dd')})}
)}
而Reader自己定义为null。
还有其他解决方案吗?
${field.value:equals('0')
:ifElse(
'',
${field.value:replace(
${field.value},${field.value:toDate('M/dd/yyyy hh:mm:ss a'):format('yyyy-MM-dd')}
)}
)}
这个问题是基于我的旧问题:
我使用了带有自定义 CSVReader
和 CSVRecordSetWriter
服务的解决方案。几天前,我注意到带有日期的字段可以包含无效的日期格式,例如可以使用值 0
而不是日期 1/29/2020 3:00:00 AM
。因此,UpdateRecord
处理器无法解析此 csv:
AdvertiserID,CampaignStartDate,CampaignEndDate,CampaignName
10730729,1/29/2020 3:00:00 AM,2/20/2020 3:00:00 AM,Nestle
40376079,0,4/1/2020 3:00:00 AM,Heinz
...
我决定在没有自定义 CSV
服务的情况下使用 UpdateRecord
并像这样更新日期格式:
/CampaignStartDate ${field.value:equals('0'):ifElse('null', ${field.value:toDate("MM/dd/yyyy hh:mm:ss a"):format("yyyy-MM-dd"))}
所以,我想将 if-else
逻辑放入 UpdateRecord
处理器中。但是我遇到了两个问题:
- 它把
null
写成字符串,但数据类型应该是null
。 - 它将
${field.value:toDate("MM/dd/yyyy hh:mm:ss a"):format("yyyy-MM-dd"))
写为字段值
结果是:
AdvertiserID,CampaignStartDate,CampaignEndDate,CampaignName
10730729,${field.value:toDate("MM/dd/yyyy hh:mm:ss a"):format("yyyy-MM-dd")),2/20/2020 3:00:00 AM,Nestle
40376079,null,4/1/2020 3:00:00 AM,Heinz
...
对于这种情况,我如何在 Apache NiFi 中实现 if/else 逻辑?
更新
我解决了问题 #2:
${field.value:equals('0')
:ifElse(
'null',
${field.value:replace(${field.value},${field.value:toDate('M/dd/yyyy hh:mm:ss a'):format('yyyy-MM-dd')})}
)}
但是问题 #1 仍然存在。因为我无法将 null
(它写为字符串)保存到 date
类型的数据库列。它returns:
ERROR: invalid input syntax for type date: "null" Where: COPY null_place_report_8246a29a_f620_4333_97f5_e47, row 62, column campaign_start_date: "null"
更新 #2
已解决问题 #1。将表达式更改为:
${field.value:equals('0')
:ifElse(
'',
${field.value:replace(${field.value},${field.value:toDate('M/dd/yyyy hh:mm:ss a'):format('yyyy-MM-dd')})}
)}
而Reader自己定义为null。
还有其他解决方案吗?
${field.value:equals('0')
:ifElse(
'',
${field.value:replace(
${field.value},${field.value:toDate('M/dd/yyyy hh:mm:ss a'):format('yyyy-MM-dd')}
)}
)}