schemadesign part-3

This commit is contained in:
liujianhuan 2020-04-18 21:41:06 +08:00
parent 59b18cb199
commit dc8bde1eae
2 changed files with 65 additions and 1 deletions

View File

@ -87,5 +87,68 @@ Druid可以在接收数据时将其汇总以最小化需要存储的原始数
有关如何配置数值维度的详细信息,请参阅 [`dimensionsSpec`文档](ingestion.md#dimensionsSpec)
#### 辅助时间戳
Druid schema必须始终包含一个主时间戳, 主时间戳用于对数据进行 [分区和排序](ingestion.md#分区)因此它应该是您最常筛选的时间戳。Druid能够快速识别和检索与主时间戳列的时间范围相对应的数据。
如果数据有多个时间戳,则可以将其他时间戳作为辅助时间戳摄取。最好的方法是将它们作为 [毫秒格式的Long类型维度](ingestion.md#dimensionsspec) 摄取。如有必要,可以使用 [`transformSpec`](ingestion.md#transformspec) 和 `timestamp_parse` 等 [表达式](../Misc/expression.md) 将它们转换成这种格式,后者返回毫秒时间戳。
在查询时,可以使用诸如 `MILLIS_TO_TIMESTAMP`、`TIME_FLOOR` 等 [SQL时间函数](../Querying/druidsql.md) 查询辅助时间戳。如果您使用的是原生Druid查询那么可以使用 [表达式](../Misc/expression.md)。
#### 嵌套维度
在编写本文时Druid不支持嵌套维度。嵌套维度需要展平例如如果您有以下数据
```
{"foo":{"bar": 3}}
```
然后在编制索引之前,应将其转换为:
```
{"foo_bar": 3}
```
Druid能够将JSON、Avro或Parquet输入数据展平化。请阅读 [展平规格](ingestion.md#flattenspec) 了解更多细节。
#### 计数接收事件数
#### 无schema的维度列
启用rollup后查询时的计数聚合器(count aggregator)实际上不会告诉您已摄取的行数。它们告诉您Druid数据源中的行数可能小于接收的行数。
在这种情况下,可以使用*摄取时*的计数聚合器来计算事件数。但是需要注意的是在查询此Metrics时应该使用 `longSum` 聚合器。查询时的 `count` 聚合器将返回时间间隔的Druid行数该行数可用于确定rollup比率。
为了举例说明,如果摄取规范包含:
```
...
"metricsSpec" : [
{
"type" : "count",
"name" : "count"
},
...
```
您应该使用查询:
```
...
"aggregations": [
{ "type": "longSum", "name": "numIngestedEvents", "fieldName": "count" },
...
```
#### 无schema的维度列
如果摄取规范中的 `dimensions` 字段为空Druid将把不是timestamp列、已排除的维度和metric列之外的每一列都视为维度。
注意当使用无schema摄取时所有维度都将被摄取为字符串类型的维度。
##### 包含与Dimension和Metric相同的列
一个具有唯一ID的工作流能够对特定ID进行过滤同时仍然能够对ID列进行快速的唯一计数。如果不使用无schema维度则通过将Metric的 `name` 设置为与维度不同的值来支持此场景。如果使用无schema维度这里的最佳实践是将同一列包含两次一次作为维度一次作为 `hyperUnique` Metric。这可能涉及到ETL时的一些工作。
例如对于无schema维度请重复同一列
```
{"device_id_dim":123, "device_id_met":123}
```
同时在 `metricsSpec` 中包含:
```
{ "type" : "hyperUnique", "name" : "devices", "fieldName" : "device_id_met" }
```
`device_id_dim` 将自动作为维度来被选取

1
Misc/expression.md Normal file
View File

@ -0,0 +1 @@
<!-- toc -->