将空值写入Parquet文件

时间:2018-07-13 21:46:35

标签: apache parquet

我正在使用Parquet CPP library将MySQL数据库中的数据写入到镶木地板文件中。我有两个问题:

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

2)如何将NULL值插入列?我只是将null指针传递给value参数吗?

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

谢谢!

1 个答案:

答案 0 :(得分:0)

@ Ivy.W我最近一直在使用镶木地板CPP,这就是我的理解 Parquet模式需要了解您要读取和写入的表的每一列。如果该列可为空,则表示repetitionType是可选的;如果该列不可为空,则表示repetitionType是必需的,否则它将重复(对于诸如map,list等的嵌套结构)。让我快速介绍一下定义和重复级别:

镶木地板中的定义级别是识别要写入的值是否可为空,即,我们应该告诉特定字段为NULL的级别。因此,基本上,如果您想重新构造模式,我们可以使用定义和重复级别。 字段可以是可选/必需/重复的。如果该字段是必填字段,则表示该字段不能为null,因此不需要定义级别。如果为可选,则0的值为null,非null的值为1。如果架构是嵌套的,则我们将相应地使用其他值。 例如

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

a的定义级别为0,b的定义为1,c的定义为2。 enter image description here

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

message list{
  repeated string list;
}

数据类似于:["a","b","c"],看起来像:

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

要写空值,请确保架构知道该列为可空值,并只需将定义级别传递为0,并使用镶木地板writebatch来处理其余部分。

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