Drill默认装载了一个dfs插件,它的connection配置是本地文件系统, 所以就是访问本地文件的。
我在web UI上,把dfs的配置copy了一份,再创建一个HDFS的配置。它们的内容基本差不多,只是connection那里稍有不同。我的HDFS存储插件配置如下:
{
"type": "file",
"connection": "hdfs://localhost:9000",
"workspaces": {
"tmp": {
"location": "/tmp/test",
"writable": true,
"defaultInputFormat": null,
"allowAccessOutsideWorkspace": false
}
},
"formats": {
"parquet": {
"type": "parquet"
},
"json": {
"type": "json",
"extensions": [
"json"
]
},
"csvh": {
"type": "text",
"extensions": [
"csvh"
],
"extractHeader": true
},
"avro": {
"type": "avro",
"extensions": [
"avro"
]
},
"csv": {
"type": "text",
"extensions": [
"csv"
]
}
},
"enabled": true
}
基本上,只要把connection那里,改成指向HDFS文件系统即可。workspace里的路径,改成HDFS上的路径。支持的文件类型,默认有很多,我这里只启用了parquet, json, csv, csvh, avro这几种。
这里注意下csv与csvh的区别。顾名思义,csvh就是带了一个header的csv。由于在csvh配置里,启用了解析header,所以Drill读取csvh结尾的文件后,会自动按照header的定义来拆分列。
默认的csv没有配置解析header,它把所有列都读到一个数组里,显然不方便。当然,你也可以在csv的配置里加上那一行:”extractHeader”: true。加上后,csv也可以按照列来进行拆分了。
现在我上传一个csvh文件到HDFS文件系统里:
$ hdfs dfs -put people.csvh /tmp/test
然后在drill shell里,切换到这个路径,就可以执行select查询了。
apache drill (hdfs.tmp)> use hdfs.tmp;
+------+--------------------------------------+
| ok | summary |
+------+--------------------------------------+
| true | Default schema changed to [hdfs.tmp] |
+------+--------------------------------------+
1 row selected (0.09 seconds)
apache drill (hdfs.tmp)> select name,sex,born,zip,salary from `people.csvh` limit 5;
+---------------+--------+------------+-------+---------+
| name | sex | born | zip | salary |
+---------------+--------+------------+-------+---------+
| Kaylee L.Z. | Female | 1990-10-17 | 25345 | 11532.0 |
| Nylah R.R. | Female | 1983-9-12 | 87888 | 24868.0 |
| Marcos T.K. | Male | 1988-10-7 | 37129 | 8709.0 |
| Louis L.I. | Male | 1996-5-23 | 54428 | 7516.0 |
| Emmanuel D.C. | Male | 1994-11-21 | 95107 | 22373.0 |
+---------------+--------+------------+-------+---------+
5 rows selected (0.2 seconds)
我在HDFS存储插件配置里,设置了HDFS路径可以写入,所以还可以往HDFS里创建数据表:
apache drill (hdfs.tmp)> create table tt2 as select * from `people.csvh` limit 100;
+----------+---------------------------+
| Fragment | Number of records written |
+----------+---------------------------+
| 0_0 | 100 |
+----------+---------------------------+
1 row selected (0.239 seconds)
以及查询新创建的表:
apache drill (hdfs.tmp)> select count(*) as dd from tt2;
+-----+
| dd |
+-----+
| 100 |
+-----+
1 row selected (0.168 seconds)
但这个新创建的表,不知为何没有出现在show tables命令里,这有待查实。
apache drill (hdfs.tmp)> show tables;
+--------------+------------+
| TABLE_SCHEMA | TABLE_NAME |
+--------------+------------+
No rows selected (0.149 seconds)
总体上,hdfs存储插件,与默认的的dfs存储插件,使用方式上是差不多的。它们都是基于文件的,可以解析不同的文件格式。访问文件的方式都一样,只是存储路径不同而已。