使用Drill的HDFS存储插件

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存储插件,使用方式上是差不多的。它们都是基于文件的,可以解析不同的文件格式。访问文件的方式都一样,只是存储路径不同而已。

Print this entry