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 初始化时的默认端口。
  5. 点击 “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)
  2. 切换到 mongo.text。

    1. USE mongo.test;
    2. +-------+-----------------------------------------+
    3. | ok | summary |
    4. +-------+-----------------------------------------+
    5. | true | Default schema changed to [mongo.test] |
    6. +-------+-----------------------------------------+
  3. 展示表名和验证 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)
  4. 设置选择,读取数字时,以 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;
  2. +---------------+-------------------------+--------+--------+
  3. | city | loc | pop | state |
  4. +---------------+-------------------------+--------+--------+
  5. | AGAWAM | [-72.622739,42.070206] | 15338 | MA |
  6. | CUSHMAN | [-72.51565,42.377017] | 36963 | MA |
  7. | BELCHERTOWN | [-72.410953,42.275103] | 10579 | MA |
  8. | BLANDFORD | [-72.936114,42.182949] | 1240 | MA |
  9. | BRIMFIELD | [-72.188455,42.116543] | 3706 | MA |
  10. | CHESTERFIELD | [-72.833309,42.38167] | 177 | MA |
  11. | BARRE | [-72.108354,42.409698] | 4546 | MA |
  12. | CHICOPEE | [-72.607962,42.162046] | 23396 | MA |
  13. | CHICOPEE | [-72.576142,42.176443] | 31495 | MA |
  14. | CHESTER | [-72.988761,42.279421] | 1688 | MA |
  15. +---------------+-------------------------+--------+--------+
  16. 10 rows selected (0.444 seconds)

示例2:聚合

  1. SELECT city, avg(pop) FROM zips GROUP BY city LIMIT 10;
  2. +---------------+---------------------+
  3. | city | EXPR$1 |
  4. +---------------+---------------------+
  5. | AGAWAM | 15338.0 |
  6. | CUSHMAN | 18649.5 |
  7. | BELCHERTOWN | 10579.0 |
  8. | BLANDFORD | 1240.0 |
  9. | BRIMFIELD | 2441.5 |
  10. | CHESTERFIELD | 9988.857142857143 |
  11. | BARRE | 9770.0 |
  12. | CHICOPEE | 27445.5 |
  13. | CHESTER | 7285.0952380952385 |
  14. | WESTOVER AFB | 1764.0 |
  15. +---------------+---------------------+
  16. 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. +------------------------+
  16. 0: jdbc:drill:zk=local> SELECT loc[0] FROM zips LIMIT 10;
  17. +------------+
  18. | EXPR$0 |
  19. +------------+
  20. | -72.622739 |
  21. | -72.51565 |
  22. | -72.108354 |
  23. | -72.410953 |
  24. | -72.936114 |
  25. | -72.188455 |
  26. | -72.988761 |
  27. | -72.833309 |
  28. | -72.607962 |
  29. | -72.576142 |
  30. +------------+

使用 ODBC/JDBC 驱动

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