Bootstrap

flink写parquet解决timestamp时间格式字段问题

背景

        Apache Parquet 是一种开源的列式数据文件格式,旨在实现高效的数据存储和检索。它提供高性能压缩和编码方案(encoding schemes)来批量处理复杂数据,并且受到许多编程语言和分析工具的支持。

        在我们通过flink写入parquet文件的时候,会遇到timestamp时间格式写入的问题。flink官方sdk提供的avro定义转换为parquet文件字段定义是没有timestamp类型的,得另找方法解决。

parquet的时间字段

        parquet字段定义存在如下几种类型:

  • BOOLEAN: 1 bit boolean
  • INT32: 32 bit signed ints
  • INT64: 64 bit signed ints
  • INT96: 96 bit signed ints
  • FLOAT: IEEE 32-bit floating point values
  • DOUBLE: IEEE 64-bit floating point values
  • BYTE_ARRAY: 任意长度 byte 数组

        其中timestamp使用int96类型进行存储,只有使用int96按照指定格式存储时间格式,我们才可以通过hive,sparksql等计算引擎读取正确的时间数据。

flink2parquet

      flink官方提供的写入parquet的处理方式如下:

    String avroSchema = "";

    //构建parquet格式定义
    Schema schema = new Schema.Parser().parse(avroSchema);


    BulkWriter.Factory<GenericRecord> writerFactory = ParquetAvroWriters.forGenericRecord(schema);

    org.apache.flink.connector.file.sink.FileSink fileSink = org.apache.flink.connector.file.sink.FileSink.forBulkFormat(
                    new org.apache.flink.core.fs.Path("hdfs://xxxxx/xx/xx"), writerFactory)
            .withRollingPolicy(OnCheckpointRollingPolicy.build())
            .build();

    datastream.sin
;