Apache nifi 使用ApacheNIFI在CSV中转换日期格式

Apache nifi 使用ApacheNIFI在CSV中转换日期格式,apache-nifi,Apache Nifi,我需要在ApacheNIFI环境中修改CSV文件 我的CSV看起来像文件: Advertiser ID,Campaign Start Date,Campaign End Date,Campaign Name 10730729,1/29/2020 3:00:00 AM,2/20/2020 3:00:00 AM,Nestle 40376079,2/1/2020 3:00:00 AM,4/1/2020 3:00:00 AM,Heinz ... 我想将带有AM/PM值的日期转换为简单日期格式。每行从2

我需要在ApacheNIFI环境中修改CSV文件

我的CSV看起来像文件:

Advertiser ID,Campaign Start Date,Campaign End Date,Campaign Name
10730729,1/29/2020 3:00:00 AM,2/20/2020 3:00:00 AM,Nestle
40376079,2/1/2020 3:00:00 AM,4/1/2020 3:00:00 AM,Heinz
...
我想将带有AM/PM值的日期转换为简单日期格式。每行从2020年1月29日凌晨3:00:00到2020年1月29日。我读过关于
UpdateRecord
处理器的文章,但有一个问题。如您所见,CSV头包含空格,我甚至不能用替换值策略(文本和记录路径)解析这些字段


有什么办法解决这个问题吗?也许我应该将标题从
广告客户ID
修改为
广告客户ID
,等等?

您不需要自己进行转换,您可以让您的读者和作者为您处理。要让CSV阅读器识别日期,您需要为行定义一个模式。您的模式类似于这样(我已经从列名中删除了空格,因为它们是不允许的):

要配置读卡器,请设置以下属性:

  • 架构访问策略=使用“架构文本”属性
  • 模式文本=(代码块上方)
  • 将第一行视为Header=True
  • 时间戳格式=“MM/dd/yyyy hh:MM:ss a”
此外,如果您不想或无法更改上游系统以删除空格,则可以将此属性设置为忽略CSV的标题

  • 忽略CSD标题列名=True
然后,在CSVRecordSetWriter服务中,您可以指定以下内容:

  • 模式访问策略=继承记录模式
  • 时间戳格式=“yyyy-MM-dd”
您可以使用UpdateRecord或ConvertRecord(或其他允许您同时指定读卡器和写卡器的文件),它只会为您进行转换。UpdateRecord和ConvertRecord之间的区别在于UpdateRecord要求您指定一个用户定义的属性,因此,如果这是您将进行的唯一更改,只需使用ConvertRecord即可。如果有其他转换,则应使用UpdateRecord并同时进行这些更改


警告:这将使用新列名(在我的示例中,是不带空格的列名)重写文件,因此请记住这一点,以便在下游使用。

您不需要亲自进行转换,您可以让您的读者和作者为您处理转换。要让CSV阅读器识别日期,您需要为行定义一个模式。您的模式类似于这样(我已经从列名中删除了空格,因为它们是不允许的):

要配置读卡器,请设置以下属性:

  • 架构访问策略=使用“架构文本”属性
  • 模式文本=(代码块上方)
  • 将第一行视为Header=True
  • 时间戳格式=“MM/dd/yyyy hh:MM:ss a”
此外,如果您不想或无法更改上游系统以删除空格,则可以将此属性设置为忽略CSV的标题

  • 忽略CSD标题列名=True
然后,在CSVRecordSetWriter服务中,您可以指定以下内容:

  • 模式访问策略=继承记录模式
  • 时间戳格式=“yyyy-MM-dd”
您可以使用UpdateRecord或ConvertRecord(或其他允许您同时指定读卡器和写卡器的文件),它只会为您进行转换。UpdateRecord和ConvertRecord之间的区别在于UpdateRecord要求您指定一个用户定义的属性,因此,如果这是您将进行的唯一更改,只需使用ConvertRecord即可。如果有其他转换,则应使用UpdateRecord并同时进行这些更改

警告:这将使用新的列名(在我的示例中,是不带空格的列名)重写文件,因此请记住这一点,以便在下游使用

{
    "type": "record",
    "name": "ExampleCSV",
    "namespace": "Stackoverflow",
    "fields": [
        {"name": "AdvertiserID", "type": "string"},
        {"name": "CampaignStartDate", "type" : {"type": "long", "logicalType" : "timestamp-micros"}},
        {"name": "CampaignEndDate", "type" : {"type": "long", "logicalType" : "timestamp-micros"}},
        {"name": "CampaignName", "type": "string"}
    ]
}