在 Apache NiFi 中转换日期

Convert dates in Apache NiFi

这个问题是基于我的旧问题:

我使用了带有自定义 CSVReaderCSVRecordSetWriter 服务的解决方案。几天前,我注意到带有日期的字段可以包含无效的日期格式,例如可以使用值 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 处理器中。但是我遇到了两个问题:

  1. 它把null写成字符串,但数据类型应该是null
  2. 它将${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')}
          )}
)}