MongoDB 存储插件
概述
Drill 支持 MongoDB 3.0,提供一个 MongoDB 存储插件去连接 MongoDB,使用 MongoDB 最新的 Java 驱动。你可以运行查询去读取,但是不能写入。若是尝试写数据到 MongoDB,会返回一个错误。你不需要定义 schema。
提示:在下面的例子中,使用了一个简单的实例。
在分布式模式中,你可以运行 Drill 和 MongoDB 在一起。
开始之前
用 Drill 查询 MongoDB,你需要安装 Drill 和 MongoDB,然后导入数据到 MongoDB 中。
- 如果你没有安装 Drill,需要先安装 Drill。
- 如果你没有安装 MongoDB,需要先安装 MongoDB。
- 导入 MongoDB 示例数据集 。复制
zips.json
的内容到一个文件进行保存。- 如果
/data/db
目录不存在,创建它。 - 确保你有权限访问该目录。
- 使用 MongoDB 导入
zips.json
。
- 如果
配置 MongoDB
Drill 必需正在运行,然后能够进入到 Web 控制台配置存储插件。打开 Drill ,看到 MongoDB 存储插件配置并启用它,具体描述步骤如下所示:
- 启动 Drill Shell。Drill Shell 需要正常运行,并能够访问 Drill Web 控制台。
- 在 Drill Web 控制台,进入到 “Storage” 栏。
- 在禁止的存储插件中,选择 “Update” 去配置
mongo
存储插件。 - 在配置窗口,默认配置信息如下所示:
{
"type": "mongo",
"connection": "mongodb://localhost:27017/",
"enabled": false
}
提示:27017 是 MongoDB 初始化时的默认端口。
- 点击 “Enable” 去启用存储插件。
查询 MongoDB
在 Drill Shell 中,设置 Drill,导入 zips 数据集到 MongoDB 中。
从 Drill 数据源中获取 schemas 列表,包含 MongoDB。
SHOW DATABASES;
+---------------------+
| SCHEMA_NAME |
+---------------------+
| INFORMATION_SCHEMA |
| cp.default |
| dfs.default |
| dfs.root |
| dfs.tmp |
| mongo.local |
| mongo.test |
| sys |
+---------------------+
8 rows selected (1.385 seconds)
切换到 mongo.text。
USE mongo.test;
+-------+-----------------------------------------+
| ok | summary |
+-------+-----------------------------------------+
| true | Default schema changed to [mongo.test] |
+-------+-----------------------------------------+
展示表名和验证
zips
数据集:SHOW TABLES;
+---------------+-----------------+
| TABLE_SCHEMA | TABLE_NAME |
+---------------+-----------------+
| mongo.test | system.indexes |
| mongo.test | zips |
+---------------+-----------------+
2 rows selected (0.187 seconds)
- 设置选择,读取数字时,以 doubles 的方式替代 text 方式读取;
ALTER SYSTEM SET `store.mongo.read_numbers_as_double` = true;
+-------+----------------------------------------------+
| ok | summary |
+-------+----------------------------------------------+
| true | store.mongo.read_numbers_as_double updated. |
+-------+----------------------------------------------+
1 row selected (0.078 seconds)
查询示例
示例1:展示 zips 数据集
SELECT * FROM zips LIMIT 10;
+---------------+-------------------------+--------+--------+
| city | loc | pop | state |
+---------------+-------------------------+--------+--------+
| AGAWAM | [-72.622739,42.070206] | 15338 | MA |
| CUSHMAN | [-72.51565,42.377017] | 36963 | MA |
| BELCHERTOWN | [-72.410953,42.275103] | 10579 | MA |
| BLANDFORD | [-72.936114,42.182949] | 1240 | MA |
| BRIMFIELD | [-72.188455,42.116543] | 3706 | MA |
| CHESTERFIELD | [-72.833309,42.38167] | 177 | MA |
| BARRE | [-72.108354,42.409698] | 4546 | MA |
| CHICOPEE | [-72.607962,42.162046] | 23396 | MA |
| CHICOPEE | [-72.576142,42.176443] | 31495 | MA |
| CHESTER | [-72.988761,42.279421] | 1688 | MA |
+---------------+-------------------------+--------+--------+
10 rows selected (0.444 seconds)
示例2:聚合
SELECT city, avg(pop) FROM zips GROUP BY city LIMIT 10;
+---------------+---------------------+
| city | EXPR$1 |
+---------------+---------------------+
| AGAWAM | 15338.0 |
| CUSHMAN | 18649.5 |
| BELCHERTOWN | 10579.0 |
| BLANDFORD | 1240.0 |
| BRIMFIELD | 2441.5 |
| CHESTERFIELD | 9988.857142857143 |
| BARRE | 9770.0 |
| CHICOPEE | 27445.5 |
| CHESTER | 7285.0952380952385 |
| WESTOVER AFB | 1764.0 |
+---------------+---------------------+
10 rows selected (1.664 seconds)
示例3:列嵌套数组
0: jdbc:drill:zk=local> SELECT loc FROM zips LIMIT 10;
+------------------------+
| loc |
+------------------------+
| [-72.622739,42.070206] |
| [-72.51565,42.377017] |
| [-72.108354,42.409698] |
| [-72.410953,42.275103] |
| [-72.936114,42.182949] |
| [-72.188455,42.116543] |
| [-72.988761,42.279421] |
| [-72.833309,42.38167] |
| [-72.607962,42.162046] |
| [-72.576142,42.176443] |
+------------------------+
0: jdbc:drill:zk=local> SELECT loc[0] FROM zips LIMIT 10;
+------------+
| EXPR$0 |
+------------+
| -72.622739 |
| -72.51565 |
| -72.108354 |
| -72.410953 |
| -72.936114 |
| -72.188455 |
| -72.988761 |
| -72.833309 |
| -72.607962 |
| -72.576142 |
+------------+
使用 ODBC/JDBC 驱动
你可以通过标准的 BI 工具查询 MongoDB,例如 Tableau 和 SQuirreL。