【问题标题】:Parse microseconds in Apache NiFi在 Apache NiFi 中解析微秒
【发布时间】:2019-03-06 15:07:06
【问题描述】:

我想通过 CSVRecordReader 将以下包含时间戳(以微秒为单位)的 CSV 内容通过 AvroRecordSetWriter 转换为 AvroRecord:

timestamp,value    
1551784149996000,1

我正在使用以下 Avro 架构:

{
  "name": "TestRecord",
  "type": "record",
  "fields": [
    {
      "name": "timestamp",
      "type" :
      {
        "type" : "long",
        "logicalType" : "timestamp-micros"
      }
    },
    {
      "name": "value",
      "type": "long"
    }
  ]
}

CSVRecordReader 似乎将微秒解释为毫秒,因此 AvorRecordSetWriter 的输出包含另外三个零:

1551784750036000000

时间戳字段将被假定为毫秒数 纪元(格林威治标准时间 1970 年 1 月 1 日午夜) https://nifi.apache.org/docs/nifi-docs/components/org.apache.nifi/nifi-record-serialization-services-nar/1.9.0/org.apache.nifi.csv.CSVReader/index.html

如何在 NiFi 中解析微秒并使用此架构将其转换为 Avro 或 Parquet?

也许任何 NiFi RecordReader 都支持以下 Instant ISO 格式?

2019-03-01T13:12:34.567123Z

【问题讨论】:

标签: apache-nifi


【解决方案1】:

最简单的方法可能是在ConvertRecord 之后(如果您需要保持微秒精度)或在ConvertRecord 之前(如果您只需要毫秒精度)使用UpdateRecord 处理器来修剪最后三位数字那个领域。

您可以使用记录路径功能substringBeforeLast 通过substringBeforeLast(timestamp, '000') 进行修剪。

【讨论】:

  • 我的ConvertRecord 中的AvroRecordSetWriter 似乎在毫秒到微秒的转换过程中最后添加了这些零值。如果我之后使用UpdateRecord 按照建议截断零​​,我会收到以下错误:--- IllegalTypeConversionException: Could not convert value [1550865604871] of type java.lang.String to Timestamp for field timestamp because the value is not in the expected date format: org.apache.nifi.avro.AvroTypeUtil$$Lambda$1007/1287416711@3eba4c98
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-23
  • 1970-01-01
  • 2019-08-01
  • 1970-01-01
  • 2015-07-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多