使用 Apache Nifi 转换 CSV 中的日期格式
Transform date format inside CSV using Apache Nifi
我需要在 Apache Nifi 环境中修改 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值的日期转换为简单日期格式。每行从 1/29/2020 3:00:00 AM
到 2020-01-29
。我阅读了有关 UpdateRecord
处理器的信息,但有一个问题。如您所见,CSV headers 包含空格,我什至无法使用 替换值策略(文字和记录路径)。
有解决这个问题的想法吗?也许我应该以某种方式将 headers 从 Advertiser ID
修改为 advertiser_id
,等等?
您实际上不需要自己进行转换,您可以让 Reader 和 Writers 为您处理。不过,要让 CSV Reader 识别日期,您需要为行定义架构。您的架构看起来像这样(我已经从列名中删除了空格,因为它们是不允许的):
{
"type": "record",
"name": "ExampleCSV",
"namespace": "Whosebug",
"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"}
]
}
要配置 reader,请设置以下属性:
- 模式访问策略=使用'Schema Text'属性
- 架构文本=(代码块上方)
- 将第一行视为 Header = True
- 时间戳格式 = "MM/dd/yyyy hh:mm:ss a"
此外,如果您不想或无法更改上游系统以删除空格,您可以设置此 属性 以忽略 CSV 的 Header。
- 忽略 CSD Header 列名 = True
然后在您的 CSVRecordSetWriter 服务中您可以指定以下内容:
- 架构访问策略 = 继承记录架构
- 时间戳格式 =“yyyy-MM-dd”
您可以使用 UpdateRecord 或 ConvertRecord(或其他只要它们允许您同时指定 reader 和编写器),它只会为您进行转换。 UpdateRecord 和 ConvertRecord 的区别在于 UpdateRecord 需要您指定一个用户定义的 属性,因此如果这是您要做的唯一更改,只需使用 ConvertRecord。如果您有其他转换,您应该使用 UpdateRecord 并同时进行这些更改。
警告:这将使用新的列名(在我的示例中,没有空格的列名)重写文件,因此请记住这一点以供下游使用。
我需要在 Apache Nifi 环境中修改 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值的日期转换为简单日期格式。每行从 1/29/2020 3:00:00 AM
到 2020-01-29
。我阅读了有关 UpdateRecord
处理器的信息,但有一个问题。如您所见,CSV headers 包含空格,我什至无法使用 替换值策略(文字和记录路径)。
有解决这个问题的想法吗?也许我应该以某种方式将 headers 从 Advertiser ID
修改为 advertiser_id
,等等?
您实际上不需要自己进行转换,您可以让 Reader 和 Writers 为您处理。不过,要让 CSV Reader 识别日期,您需要为行定义架构。您的架构看起来像这样(我已经从列名中删除了空格,因为它们是不允许的):
{
"type": "record",
"name": "ExampleCSV",
"namespace": "Whosebug",
"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"}
]
}
要配置 reader,请设置以下属性:
- 模式访问策略=使用'Schema Text'属性
- 架构文本=(代码块上方)
- 将第一行视为 Header = True
- 时间戳格式 = "MM/dd/yyyy hh:mm:ss a"
此外,如果您不想或无法更改上游系统以删除空格,您可以设置此 属性 以忽略 CSV 的 Header。
- 忽略 CSD Header 列名 = True
然后在您的 CSVRecordSetWriter 服务中您可以指定以下内容:
- 架构访问策略 = 继承记录架构
- 时间戳格式 =“yyyy-MM-dd”
您可以使用 UpdateRecord 或 ConvertRecord(或其他只要它们允许您同时指定 reader 和编写器),它只会为您进行转换。 UpdateRecord 和 ConvertRecord 的区别在于 UpdateRecord 需要您指定一个用户定义的 属性,因此如果这是您要做的唯一更改,只需使用 ConvertRecord。如果您有其他转换,您应该使用 UpdateRecord 并同时进行这些更改。
警告:这将使用新的列名(在我的示例中,没有空格的列名)重写文件,因此请记住这一点以供下游使用。