首页 > 解决方案 > 将空值写入 Parquet 文件

问题描述

我正在使用Parquet CPP 库将数据从 MySQL 数据库写入 parquet 文件。我有两个问题:

1)模式中的重复是什么意思?当我们将列定义为 NULL 或 NOT NULL 时,它是否与表约束有关?

2) 如何在列中插入 NULL 值?我只是将一个空指针传递给 value 参数吗?

WriteBatch(int64_t num_levels, const int16_t* def_levels,
                    const int16_t* rep_levels,
                    const typename ParquetType::c_type* values)  

提前致谢!

标签: apacheparquet

解决方案


@Ivy.WI 最近在工作中一直在使用 parquet CPP,这就是我理解 Parquet 模式需要了解您将要读取和写入的表的每一列的内容。如果该列是可空的,则意味着它repetitionType是可选的,如果它不是可空的,则意味着它repetitionType是必需的,否则它将被重复(对于嵌套结构,如地图、列表等)。让我快速介绍一下定义和重复级别:

parquet 中的定义级别是识别要写入的值是否可以为空,即我们应该告诉特定字段的级别NULL。所以基本上,如果你想重建模式,我们可以使用定义和重复级别。字段可以是可选的/必需的/重复的。如果该字段是必需的,则意味着它不能为空,因此不需要定义级别。如果它是可选的,它将是0fornull1for 非 null。如果模式是嵌套的,我们会相应地使用附加值。例如

message ExampleDefinitionLevel {
  optional group a {
    optional group b {
      optional string c;
    }
  }
}

a 的定义级别为 0,b 的定义级别为 1,c 的定义级别为 2。 在此处输入图像描述

重复级别:重复级别仅适用于嵌套结构,例如列表、地图等。例如,当用户可以拥有多个电话号码时,该字段将被“重复”。例如

message list{
  repeated string list;
}

数据会像:["a","b","c"]并且看起来像:

{
  list:"a",
  list:"b",
  list:"c"
}

要写入 null,请确保架构知道该列是可以为空的,并且只需传递定义级别0,parquetwritebatch应该负责其余的工作。

请参考https://blog.twitter.com/engineering/en_us/a/2013/dremel-made-simple-with-parquet.html


推荐阅读