MongoDB 存储插件

概述

Drill 支持 MongoDB 3.0,提供一个 MongoDB 存储插件去连接 MongoDB,使用 MongoDB 最新的 Java 驱动。你可以运行查询去读取,但是不能写入。若是尝试写数据到 MongoDB,会返回一个错误。你不需要定义 schema。


1. 提示:在下面的例子中,使用了一个简单的实例。

在分布式模式中,你可以运行 Drill 和 MongoDB 在一起。

开始之前

用 Drill 查询 MongoDB,你需要安装 Drill 和 MongoDB,然后导入数据到 MongoDB 中。

  1. 如果你没有安装 Drill,需要先安装 Drill。
  2. 如果你没有安装 MongoDB,需要先安装 MongoDB。
  3. 导入 MongoDB 示例数据集 。复制 zips.json 的内容到一个文件进行保存。 - 如果 /data/db 目录不存在,创建它。 - 确保你有权限访问该目录。 - 使用 MongoDB 导入 zips.json

配置 MongoDB

Drill 必需正在运行,然后能够进入到 Web 控制台配置存储插件。打开 Drill ,看到 MongoDB 存储插件配置并启用它,具体描述步骤如下所示:

  1. 启动 Drill Shell。Drill Shell 需要正常运行,并能够访问 Drill Web 控制台。
  2. 在 Drill Web 控制台,进入到 “Storage” 栏。
  3. 在禁止的存储插件中,选择 “Update” 去配置 mongo 存储插件。
  4. 在配置窗口,默认配置信息如下所示:

```

  1. {
  2. "type": "mongo",
  3. "connection": "mongodb://localhost:27017/",
  4. "enabled": false
  5. } ```

```

  1. 提示:27017 是 MongoDB 初始化时的默认端口。 ```
  2. 点击 “Enable” 去启用存储插件。

查询 MongoDB

在 Drill Shell 中,设置 Drill,导入 zips 数据集到 MongoDB 中。

  1. 从 Drill 数据源中获取 schemas 列表,包含 MongoDB。

```

  1. SHOW DATABASES;

  2. +---------------------+

  3. | SCHEMA_NAME |
  4. +---------------------+
  5. | INFORMATION_SCHEMA |
  6. | cp.default |
  7. | dfs.default |
  8. | dfs.root |
  9. | dfs.tmp |
  10. | mongo.local |
  11. | mongo.test |
  12. | sys |
  13. +---------------------+
  14. 8 rows selected (1.385 seconds) ```
  15. 切换到 mongo.text。

```

  1. USE mongo.test;

  2. +-------+-----------------------------------------+

  3. | ok | summary |
  4. +-------+-----------------------------------------+
  5. | true | Default schema changed to [mongo.test] |
  6. +-------+-----------------------------------------+ ```
  7. 展示表名和验证 zips 数据集:

```

  1. SHOW TABLES;

  2. +---------------+-----------------+

  3. | TABLE_SCHEMA | TABLE_NAME |
  4. +---------------+-----------------+
  5. | mongo.test | system.indexes |
  6. | mongo.test | zips |
  7. +---------------+-----------------+
  8. 2 rows selected (0.187 seconds) ```
  9. 设置选择,读取数字时,以 doubles 的方式替代 text 方式读取;

```

  1. ALTER SYSTEM SET store.mongo.read_numbers_as_double = true;
  2. +-------+----------------------------------------------+
  3. | ok | summary |
  4. +-------+----------------------------------------------+
  5. | true | store.mongo.read_numbers_as_double updated. |
  6. +-------+----------------------------------------------+
  7. 1 row selected (0.078 seconds) ```

查询示例

示例1:展示 zips 数据集


1. SELECT * FROM zips LIMIT 10;

3. +---------------+-------------------------+--------+--------+
4. |     city      |           loc           |  pop   | state  |
5. +---------------+-------------------------+--------+--------+
6. | AGAWAM        | [-72.622739,42.070206]  | 15338  | MA     |
7. | CUSHMAN       | [-72.51565,42.377017]   | 36963  | MA     |
8. | BELCHERTOWN   | [-72.410953,42.275103]  | 10579  | MA     |
9. | BLANDFORD     | [-72.936114,42.182949]  | 1240   | MA     |
10. | BRIMFIELD     | [-72.188455,42.116543]  | 3706   | MA     |
11. | CHESTERFIELD  | [-72.833309,42.38167]   | 177    | MA     |
12. | BARRE         | [-72.108354,42.409698]  | 4546   | MA     |
13. | CHICOPEE      | [-72.607962,42.162046]  | 23396  | MA     |
14. | CHICOPEE      | [-72.576142,42.176443]  | 31495  | MA     |
15. | CHESTER       | [-72.988761,42.279421]  | 1688   | MA     |
16. +---------------+-------------------------+--------+--------+
17. 10 rows selected (0.444 seconds)

示例2:聚合


1. SELECT city, avg(pop) FROM zips GROUP BY city LIMIT 10;

3. +---------------+---------------------+
4. |     city      |       EXPR$1        |
5. +---------------+---------------------+
6. | AGAWAM        | 15338.0             |
7. | CUSHMAN       | 18649.5             |
8. | BELCHERTOWN   | 10579.0             |
9. | BLANDFORD     | 1240.0              |
10. | BRIMFIELD     | 2441.5              |
11. | CHESTERFIELD  | 9988.857142857143   |
12. | BARRE         | 9770.0              |
13. | CHICOPEE      | 27445.5             |
14. | CHESTER       | 7285.0952380952385  |
15. | WESTOVER AFB  | 1764.0              |
16. +---------------+---------------------+
17. 10 rows selected (1.664 seconds)

示例3:列嵌套数组


1. 0: jdbc:drill:zk=local> SELECT loc FROM zips LIMIT 10;
2. +------------------------+
3. |    loc                 |
4. +------------------------+
5. | [-72.622739,42.070206] |
6. | [-72.51565,42.377017]  |
7. | [-72.108354,42.409698] |
8. | [-72.410953,42.275103] |
9. | [-72.936114,42.182949] |
10. | [-72.188455,42.116543] |
11. | [-72.988761,42.279421] |
12. | [-72.833309,42.38167]  |
13. | [-72.607962,42.162046] |
14. | [-72.576142,42.176443] |
15. +------------------------+

17. 0: jdbc:drill:zk=local> SELECT loc[0] FROM zips LIMIT 10;
18. +------------+
19. |   EXPR$0   |
20. +------------+
21. | -72.622739 |
22. | -72.51565  |
23. | -72.108354 |
24. | -72.410953 |
25. | -72.936114 |
26. | -72.188455 |
27. | -72.988761 |
28. | -72.833309 |
29. | -72.607962 |
30. | -72.576142 |
31. +------------+

使用 ODBC/JDBC 驱动

你可以通过标准的 BI 工具查询 MongoDB,例如 Tableau 和 SQuirreL。