druid-docs-cn/DataIngestion/dataformats.md

281 lines
15 KiB
Markdown
Raw Normal View History

2020-04-09 04:09:06 -04:00
<!-- toc -->
2020-04-10 05:01:38 -04:00
## 数据格式
Apache Druid可以接收JSON、CSV或TSV等分隔格式或任何自定义格式的非规范化数据。尽管文档中的大多数示例使用JSON格式的数据但将Druid配置为接收任何其他分隔数据并不困难。我们欢迎对新格式的任何贡献。
此页列出了Druid支持的所有默认和核心扩展数据格式。有关社区扩展支持的其他数据格式请参阅我们的 [社区扩展列表](../Configuration/extensions.md#社区扩展)。
### 格式化数据
下面的示例显示了在Druid中原生支持的数据格式
*JSON*
```
{"timestamp": "2013-08-31T01:02:33Z", "page": "Gypsy Danger", "language" : "en", "user" : "nuclear", "unpatrolled" : "true", "newPage" : "true", "robot": "false", "anonymous": "false", "namespace":"article", "continent":"North America", "country":"United States", "region":"Bay Area", "city":"San Francisco", "added": 57, "deleted": 200, "delta": -143}
{"timestamp": "2013-08-31T03:32:45Z", "page": "Striker Eureka", "language" : "en", "user" : "speed", "unpatrolled" : "false", "newPage" : "true", "robot": "true", "anonymous": "false", "namespace":"wikipedia", "continent":"Australia", "country":"Australia", "region":"Cantebury", "city":"Syndey", "added": 459, "deleted": 129, "delta": 330}
{"timestamp": "2013-08-31T07:11:21Z", "page": "Cherno Alpha", "language" : "ru", "user" : "masterYi", "unpatrolled" : "false", "newPage" : "true", "robot": "true", "anonymous": "false", "namespace":"article", "continent":"Asia", "country":"Russia", "region":"Oblast", "city":"Moscow", "added": 123, "deleted": 12, "delta": 111}
{"timestamp": "2013-08-31T11:58:39Z", "page": "Crimson Typhoon", "language" : "zh", "user" : "triplets", "unpatrolled" : "true", "newPage" : "false", "robot": "true", "anonymous": "false", "namespace":"wikipedia", "continent":"Asia", "country":"China", "region":"Shanxi", "city":"Taiyuan", "added": 905, "deleted": 5, "delta": 900}
{"timestamp": "2013-08-31T12:41:27Z", "page": "Coyote Tango", "language" : "ja", "user" : "cancer", "unpatrolled" : "true", "newPage" : "false", "robot": "true", "anonymous": "false", "namespace":"wikipedia", "continent":"Asia", "country":"Japan", "region":"Kanto", "city":"Tokyo", "added": 1, "deleted": 10, "delta": -9}
```
*CSV*
```
2013-08-31T01:02:33Z,"Gypsy Danger","en","nuclear","true","true","false","false","article","North America","United States","Bay Area","San Francisco",57,200,-143
2013-08-31T03:32:45Z,"Striker Eureka","en","speed","false","true","true","false","wikipedia","Australia","Australia","Cantebury","Syndey",459,129,330
2013-08-31T07:11:21Z,"Cherno Alpha","ru","masterYi","false","true","true","false","article","Asia","Russia","Oblast","Moscow",123,12,111
2013-08-31T11:58:39Z,"Crimson Typhoon","zh","triplets","true","false","true","false","wikipedia","Asia","China","Shanxi","Taiyuan",905,5,900
2013-08-31T12:41:27Z,"Coyote Tango","ja","cancer","true","false","true","false","wikipedia","Asia","Japan","Kanto","Tokyo",1,10,-9
```
*TSV(Delimited)*
```
2013-08-31T01:02:33Z "Gypsy Danger" "en" "nuclear" "true" "true" "false" "false" "article" "North America" "United States" "Bay Area" "San Francisco" 57 200 -143
2013-08-31T03:32:45Z "Striker Eureka" "en" "speed" "false" "true" "true" "false" "wikipedia" "Australia" "Australia" "Cantebury" "Syndey" 459 129 330
2013-08-31T07:11:21Z "Cherno Alpha" "ru" "masterYi" "false" "true" "true" "false" "article" "Asia" "Russia" "Oblast" "Moscow" 123 12 111
2013-08-31T11:58:39Z "Crimson Typhoon" "zh" "triplets" "true" "false" "true" "false" "wikipedia" "Asia" "China" "Shanxi" "Taiyuan" 905 5 900
2013-08-31T12:41:27Z "Coyote Tango" "ja" "cancer" "true" "false" "true" "false" "wikipedia" "Asia" "Japan" "Kanto" "Tokyo" 1 10 -9
```
请注意CSV和TSV数据不包含列标题。当您指定要摄取的数据时这一点就变得很重要。
除了文本格式Druid还支持二进制格式比如 [Orc](#orc) 和 [Parquet](#parquet) 格式。
### 定制格式
Druid支持自定义数据格式可以使用 `Regex` 解析器或 `JavaScript` 解析器来解析这些格式。请注意使用这些解析器中的任何一个来解析数据都不如编写原生Java解析器或使用外部流处理器那样高效。我们欢迎新解析器的贡献。
### InputFormat
> [!WARNING]
> 输入格式是在0.17.0中引入的指定输入数据的数据格式的新方法。不幸的是输入格式还不支持Druid支持的所有数据格式或摄取方法。特别是如果您想使用Hadoop接收您仍然需要使用 [解析器](#parser)。如果您的数据是以本节未列出的某种格式格式化的,请考虑改用解析器。
所有形式的Druid摄取都需要某种形式的schema对象。要摄取的数据的格式是使用[`ioConfig`](../DataIngestion/ingestion.md#ioConfig) 中的 `inputFormat` 条目指定的。
#### JSON
**JSON**
一个加载JSON格式数据的 `inputFormat` 示例:
```
"ioConfig": {
"inputFormat": {
"type": "json"
},
...
}
```
JSON `inputFormat` 有以下组件:
| 字段 | 类型 | 描述 | 是否必填 |
|-|-|-|-|
| type | String | 填 `json` | 是 |
| flattenSpec | JSON对象 | 指定嵌套JSON数据的展平配置。更多信息请参见[flattenSpec](#flattenspec) | 否 |
| featureSpec | JSON对象 | Jackson库支持的 [JSON解析器特性](https://github.com/FasterXML/jackson-core/wiki/JsonParser-Features) 。这些特性将在解析输入JSON数据时应用。 | 否 |
#### CSV
一个加载CSV格式数据的 `inputFormat` 示例:
```
"ioConfig": {
"inputFormat": {
"type": "csv",
"columns" : ["timestamp","page","language","user","unpatrolled","newPage","robot","anonymous","namespace","continent","country","region","city","added","deleted","delta"]
},
...
}
```
CSV `inputFormat` 有以下组件:
2020-04-10 05:14:28 -04:00
2020-04-10 05:01:38 -04:00
| 字段 | 类型 | 描述 | 是否必填 |
|-|-|-|-|
| type | String | 填 `csv` | 是 |
| listDelimiter | String | 多值维度的定制分隔符 | 否(默认ctrl + A) |
| columns | JSON数组 | 指定数据的列。列的顺序应该与数据列的顺序相同。 | 如果 `findColumnsFromHeader` 设置为 `false` 或者缺失, 则为必填项 |
2020-04-10 05:48:45 -04:00
| findColumnsFromHeader | 布尔 | 如果设置了此选项,则任务将从标题行中查找列名。请注意,在从标题中查找列名之前,将首先使用 `skipHeaderRows`。例如,如果将 `skipHeaderRows` 设置为2`findColumnsFromHeader` 设置为 `true`则任务将跳过前两行然后从第三行提取列信息。该项如果设置为true则将忽略 `columns` | 否(如果 `columns` 被设置则默认为 `false`, 否则为null |
| skipHeaderRows | 整型数值 | 该项如果设置,任务将略过 `skipHeaderRows`配置的行数 | 否默认为0 |
2020-04-10 05:01:38 -04:00
#### TSV(Delimited)
2020-04-10 05:48:45 -04:00
```
"ioConfig": {
"inputFormat": {
"type": "tsv",
"columns" : ["timestamp","page","language","user","unpatrolled","newPage","robot","anonymous","namespace","continent","country","region","city","added","deleted","delta"],
"delimiter":"|"
},
...
}
```
TSV `inputFormat` 有以下组件:
| 字段 | 类型 | 描述 | 是否必填 |
|-|-|-|-|
| type | String | 填 `tsv` | 是 |
| delimiter | String | 数据值的自定义分隔符 | 否(默认为 `\t`) |
| listDelimiter | String | 多值维度的定制分隔符 | 否(默认ctrl + A) |
| columns | JSON数组 | 指定数据的列。列的顺序应该与数据列的顺序相同。 | 如果 `findColumnsFromHeader` 设置为 `false` 或者缺失, 则为必填项 |
| findColumnsFromHeader | 布尔 | 如果设置了此选项,则任务将从标题行中查找列名。请注意,在从标题中查找列名之前,将首先使用 `skipHeaderRows`。例如,如果将 `skipHeaderRows` 设置为2`findColumnsFromHeader` 设置为 `true`则任务将跳过前两行然后从第三行提取列信息。该项如果设置为true则将忽略 `columns` | 否(如果 `columns` 被设置则默认为 `false`, 否则为null |
| skipHeaderRows | 整型数值 | 该项如果设置,任务将略过 `skipHeaderRows`配置的行数 | 否默认为0 |
请确保将分隔符更改为适合于数据的分隔符。与CSV一样您必须指定要索引的列和列的子集。
2020-04-10 05:01:38 -04:00
#### ORC
2020-04-10 05:48:45 -04:00
> [!WARNING]
2020-04-11 08:19:40 -04:00
> 使用ORC输入格式之前首先需要包含 [druid-orc-extensions](../Development/orc-extensions.md)
2020-04-10 05:48:45 -04:00
> [!WARNING]
> 如果您正在考虑从早于0.15.0的版本升级到0.15.0或更高版本,请仔细阅读 [从contrib扩展的迁移](../Development/orc-extensions.md#从contrib扩展迁移)。
一个加载ORC格式数据的 `inputFormat` 示例:
```
"ioConfig": {
"inputFormat": {
"type": "orc",
"flattenSpec": {
"useFieldDiscovery": true,
"fields": [
{
"type": "path",
"name": "nested",
"expr": "$.path.to.nested"
}
]
}
"binaryAsString": false
},
...
}
```
ORC `inputFormat` 有以下组件:
2020-04-11 08:19:40 -04:00
| 字段 | 类型 | 描述 | 是否必填 |
|-|-|-|-|
| type | String | 填 `orc` | 是 |
| flattenSpec | JSON对象 | 指定嵌套JSON数据的展平配置。更多信息请参见[flattenSpec](#flattenspec) | 否 |
| binaryAsString | 布尔类型 | 指定逻辑上未标记为字符串的二进制orc列是否应被视为UTF-8编码字符串。 | 否默认为false |
2020-04-10 05:01:38 -04:00
#### Parquet
2020-04-11 08:19:40 -04:00
> [!WARNING]
> 使用Parquet输入格式之前首先需要包含 [druid-parquet-extensions](../Development/parquet-extensions.md)
一个加载Parquet格式数据的 `inputFormat` 示例:
```
"ioConfig": {
"inputFormat": {
"type": "parquet",
"flattenSpec": {
"useFieldDiscovery": true,
"fields": [
{
"type": "path",
"name": "nested",
"expr": "$.path.to.nested"
}
]
}
"binaryAsString": false
},
...
}
```
Parquet `inputFormat` 有以下组件:
| 字段 | 类型 | 描述 | 是否必填 |
|-|-|-|-|
| type | String | 填 `parquet` | 是 |
| flattenSpec | JSON对象 | 定义一个 [flattenSpec](#flattenspec) 从Parquet文件提取嵌套的值。注意只支持"path"表达式('jq'不可用)| 否(默认自动发现根级别的属性) |
| binaryAsString | 布尔类型 | 指定逻辑上未标记为字符串的二进制orc列是否应被视为UTF-8编码字符串。 | 否默认为false |
2020-04-10 05:01:38 -04:00
#### FlattenSpec
2020-04-11 08:19:40 -04:00
`flattenSpec` 位于 `inputFormat` -> `flattenSpec`负责将潜在的嵌套输入数据如JSON、Avro等和Druid的平面数据模型之间架起桥梁。 `flattenSpec` 示例如下:
```
"flattenSpec": {
"useFieldDiscovery": true,
"fields": [
{ "name": "baz", "type": "root" },
{ "name": "foo_bar", "type": "path", "expr": "$.foo.bar" },
{ "name": "first_food", "type": "jq", "expr": ".thing.food[1]" }
]
}
```
> [!WARNING]
> 概念上输入数据被读取后Druid会以一个特定的顺序来对数据应用摄入规范 首先 `flattenSpec`(如果有),然后 `timestampSpec`, 然后 `transformSpec` ,最后是 `dimensionsSpec` 和 `metricsSpec`。在编写摄入规范时需要牢记这一点
展平操作仅仅支持嵌套的 [数据格式](dataformats.md), 包括:`avro`, `json`, `orc``parquet`
`flattenSpec` 有以下组件:
| 字段 | 描述 | 默认值 |
|-|-|-|
| useFieldDiscovery | 如果为true则将所有根级字段解释为可用字段供 [`timestampSpec`](../DataIngestion/ingestion.md#timestampSpec)、[`transformSpec`](../DataIngestion/ingestion.md#transformSpec)、[`dimensionsSpec`](../DataIngestion/ingestion.md#dimensionsSpec) 和 [`metricsSpec`](../DataIngestion/ingestion.md#metricsSpec) 使用。<br><br> 如果为false则只有显式指定的字段请参阅 `fields`)才可供使用。 | true |
| fields | 指定感兴趣的字段及其访问方式, 详细请见下边 | `[]` |
**字段展平规范**
`fields` 列表中的每个条目都可以包含以下组件:
<table>
<thead>
<tr>
<td>字段</td>
<td>描述</td>
<td>默认值</td>
</tr>
</thead>
<tbody>
<tr>
<td>type</td>
<td>
可选项如下:
<ul>
<li><code>root</code>, 引用记录根级别的字段。只有当<code>useFieldDiscovery</code> 为false时才真正有用。</li>
<li><code>path</code>, 引用使用 <a href="https://github.com/json-path/JsonPath">JsonPath</a> 表示法的字段,支持大多数提供嵌套的数据格式,包括<code>avro</code>,<code>csv</code>, <code>json</code><code>parquet</code></li>
<li><code>jq</code>, 引用使用 <a href="https://github.com/eiiches/jackson-jq">jackson-jq</a> 表示法的字段, 仅仅支持<code>json</code>格式</li>
</ul>
</td>
<td>none(必填)</td>
</tr>
<tr>
<td>name</td>
<td>展平后的字段名称。这个名称可以被<code>timestampSpec</code>, <code>transformSpec</code>, <code>dimensionsSpec</code><code>metricsSpec</code>引用</td>
<td>none(必填)</td>
</tr>
<tr>
<td>expr</td>
<td>用于在展平时访问字段的表达式。对于类型 `path`,这应该是 <a href="https://github.com/json-path/JsonPath">JsonPath</a>。对于 `jq` 类型,这应该是 <a href="https://github.com/eiiches/jackson-jq">jackson-jq</a> 表达式。对于其他类型,将忽略此参数。</td>
<td>none(对于 `path``jq` 类型的为必填)</td>
</tr>
</tbody>
</table>
**展平操作的注意事项**
* 为了方便起见在定义根级字段时可以只将字段名定义为字符串而不是JSON对象。例如 `{"name": "baz", "type": "root"}` 等价于 `baz`
* 启用 `useFieldDiscovery` 只会在根级别自动检测与Druid支持的数据类型相对应的"简单"字段, 这包括字符串、数字和字符串或数字列表。不会自动检测到其他类型,其他类型必须在 `fields` 列表中显式指定
* 不允许重复字段名(`name`, 否则将引发异常
* 如果启用 `useFieldDiscovery`,则将跳过与字段列表中已定义的字段同名的任何已发现字段,而不是添加两次
* [http://jsonpath.herokuapp.com/](http://jsonpath.herokuapp.com/) 对于测试 `path`-类型表达式非常有用
* jackson jq支持完整 [`jq`](https://stedolan.github.io/jq/)语法的一个子集。有关详细信息,请参阅 [jackson jq](https://github.com/eiiches/jackson-jq) 文档
2020-04-10 05:01:38 -04:00
### Parser
#### String Parser
#### Avro Hadoop Parser
#### ORC Hadoop Parser
#### Parquet Hadoop Parser
#### Parquet Avro Hadoop Parser
#### Avro Stream Parser
#### Protobuf Parser
### ParseSpec
#### JSON解析规范
#### JSON Lowercase解析规范
#### CSV解析规范
#### TSV/Delimited解析规范
#### 多值维度
#### 正则解析规范
#### JavaScript解析规范
#### 时间和维度解析规范
#### Orc解析规范
#### Parquet解析规范