Docs 菜单

采样类型冲突

在 2.6 版本中进行了更改

MongoDB 灵活的模式模型允许给定字段包含多种类型的数据,而关系数据库将列限制为单一数据类型。 BI Connector 从 MongoDB 中采样数据以生成关系模式模型,但当 BI Connector 从 MongoDB 文档中的字段中采样不同的数据类型时,可能会发生类型转换冲突。

存在多种数据类型时,可能会出现两种主要类型的类型转换冲突:标量类型之间的冲突以及涉及文档和数组等复合类型的冲突。

注意

BI Connector 仅使用数据的采样子集来检测模式生成期间的类型冲突。 如果数据集的某个字段包含类型冲突,并且冲突类型并未同时出现在样本中,则生成的模式将无法解决这些冲突,可能会导致查询延迟增加。

有关采样配置的更多信息,例如设置--samplesize--schemaRefreshIntervalSecs ,请参阅模式选项。

发生标量-标量冲突时,BI Connector 使用以下格子来确定两种不同数据类型的最小上界:

点击放大

例子

如果给定字段包含intdoublestring类型,则最小上界为string

发生标量-标量冲突时,BI Connector 会在information_schema.COLUMNS表中插入一行,并在COLUMN_COMMENT列中列出不同的采样类型。

复合冲突是指涉及文档或数组的类型转换冲突。 以下部分描述了 BI Connector 如何解决这两类复合冲突。

当发生涉及文档的冲突时,BI Connector 将文档类型的字段显示为使用点表示法的单独列。 例如, conflict collection 包含以下文档:

{ _id: 0, a: "foo" } // "a" is scalar (string)
{ _id: 1, a: { a: "bar", b: "baz" } } // "a" is composite (document)

BI Connector 检测到标量-复合冲突并生成以下关系模式:

表: conflict

_id
a
aa
ab

0

"foo"

NULL

NULL

1

NULL

"bar"

"baz"

当发生涉及文档的冲突时,BI Connector 会在information_schema.COLUMNS表中插入一行,并在COLUMN_COMMENT列中列出不同的采样类型。

当发生涉及数组的冲突时,BI Connector 会为冲突字段创建一个新表,其中包含用于外键、数组索引和值的列。 BI Connector 将数组展开为新表中的多行,并相应地填充各列。 例如, conflict collection 包含以下文档:

{ _id: 0, a: "foo" } // "a" is scalar (string)
{ _id: 1, a: ["bar", "baz"] } // "a" is composite (array)

BI Connector 将上述内容呈现为以下两个表:

表: conflict

_id

0

1

表: conflict_a

_id
a_idx
a

0

NULL

"foo"

1

0

"bar"

1

1

"baz"

当发生涉及数组的冲突时,BI Connector 会:

  • information_schema.COLUMNS表中插入一行,并在COLUMN_COMMENT列中列出采样的所有不同类型

  • information_schema.TABLES表中插入一行,其中包含有关数组如何映射到information_schema.COLUMNS表中的行的信息