我正在使用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)
谢谢!
答案 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