将unix时间戳属性转换为正常日期

时间:2018-02-20 12:50:50

标签: apache unix timestamp apache-nifi

我的Apache Nifi模板中的转换unix timestamp属性出现问题。

FlowFile :ListenTCP组件侦听传入的Squid日志。然后,UpdateAttribute组件将相应的schema.name分配给适当的模式。随后ConvertRecord组件将文件从格式转换为csv(在组件 GrokReader / RecordWriter / CSVRecordSetWriter 中我已经完成了格式为MM / dd / yyyy HH:mm:ss的时间戳格式行)。最后,PutFile组件将输出文件写入磁盘。

My Apache Nifi Template

基于此解决方案:https://community.hortonworks.com/articles/131320/using-partitionrecord-grokreaderjsonwriter-to-pars.html

这是Squid发送的日志看起来像使用代理的方式:

1518442283.483     161 127.0.0.1 TCP_MISS/200 103701 GET http://www.cnn.com/ matt DIRECT/199.27.79.73 text/html

这是Grok Expression(在 GrokReader 中):

%{NUMBER:timestamp}\s+%{NUMBER:duration}\s%{IP:client_address}\s%{WORD:cache_result}/%{POSINT:status_code}\s%{NUMBER:bytes}\s%{WORD:request_method}\s%{NOTSPACE:url}\s(%{NOTSPACE:user}|-)\s%{WORD:hierarchy_code}/%{IPORHOST:server}\s%{NOTSPACE:content_type}

这是schema.name = nifi_logs(在 AvroSchemaRegistry 中):

    {
"type": "record",
"name": "nifi_logs",
"fields": [
   { "name": "timestamp", "type": "string" },
   { "name": "duration", "type": "string" },
   { "name": "client_address", "type": "string" },
   { "name": "cache_result", "type": "string" },
   { "name": "status_code", "type": "string" },
   { "name": "bytes", "type": "string" },
   { "name": "request_method", "type": "string" },
   { "name": "url", "type": "string" },
   { "name": "user", "type": "string" },
   { "name": "hierarchy_code", "type": "string" },
   { "name": "server", "type": "string" },
   { "name": "content_type", "type": "string" }
  ]
}

在程序的输出处,我得到一个文件,其中列fomat应具有格式,例如 MM / dd / yyyy HH:mm:ss

timestamp,duration,client_address,cache_result,status_code,bytes,request_method,url,user,hierarchy_code,server,content_type
1518442283.483,161,127.0.0.1,TCP_MISS,200,103701,GET,http://www.cnn.com/,matt,DIRECT,199.27.79.73,text/html

我不知道怎么做,尽管经过多次尝试,遗憾的是无法更改时间戳格式。

我尝试了这些解决方案:

1 个答案:

答案 0 :(得分:1)

在您的模式中,所有内容都被定义为字符串,因此读者和编写者永远不会尝试使用时间戳格式,因为没有字段被解释为时间戳。

您可以更改架构以使时间戳成为实际的时间戳类型,或者您应该能够使用UpdateRecord并添加如下属性:

/timestamp = ${field.value:format('MM/dd/yyyy HH:mm:ss')}

将替换策略设置为文字值,这基本上是指通过将字符串转换为日期然后再转换为格式化日期字符串来更新时间戳字段。