Apache Drill學(xué)習(xí)筆記一:環(huán)境搭建和簡(jiǎn)單試用

簡(jiǎn)介

Apache Drill是一個(gè)低延遲的分布式海量數(shù)據(jù)(涵蓋結(jié)構(gòu)化、半結(jié)構(gòu)化以及嵌套數(shù)據(jù))交互式查詢引擎萍歉,使用ANSI SQL兼容語(yǔ)法侣颂,支持本地文件、HDFS枪孩、HBase憔晒、MongoDB等后端存儲(chǔ),支持Parquet蔑舞、JSON拒担、CSV、TSV攻询、PSV等數(shù)據(jù)格式从撼。受Google的Dremel啟發(fā),Drill滿足上千節(jié)點(diǎn)的PB級(jí)別數(shù)據(jù)的交互式商業(yè)智能分析場(chǎng)景钧栖。

安裝

Drill可以安裝在單機(jī)或者集群環(huán)境上低零,支持Linux、Windows拯杠、Mac OS X系統(tǒng)掏婶。簡(jiǎn)單起見,我們?cè)贚inux單機(jī)環(huán)境(CentOS 6.3)搭建以供試用阴挣。

準(zhǔn)備安裝包:

在$WORK(/path/to/work)目錄中安裝气堕,將jdk和drill分別解壓到j(luò)ava和drill目錄中,并打軟連以便升級(jí):

.
├── drill
│   ├── apache-drill -> apache-drill-0.8.0
│   └── apache-drill-0.8.0
├── init.sh
└── java
    ├── jdk -> jdk1.7.0_75
    └── jdk1.7.0_75

并添加一init.sh腳本初始化java相關(guān)環(huán)境變量:

export WORK="/path/to/work"
export JAVA="$WORK/java/jdk/bin/java"
export JAVA_HOME="$WORK/java/jdk"

啟動(dòng)

在單機(jī)環(huán)境運(yùn)行只需要啟動(dòng)bin/sqlline便可:

$ cd $WORK
$ . ./init.sh
$ ./drill/apache-drill/bin/sqlline -u jdbc:drill:zk=local
Drill log directory /var/log/drill does not exist or is not writable, defaulting to ...
Apr 06, 2015 12:47:30 AM org.glassfish.jersey.server.ApplicationHandler initialize
INFO: Initiating Jersey application, version Jersey: 2.8 2014-04-29 01:25:26...
sqlline version 1.1.6
0: jdbc:drill:zk=local> 

-u jdbc:drill:zk=local表示使用本機(jī)的Drill,無(wú)需啟動(dòng)ZooKeeper茎芭,如果是集群環(huán)境則需要配置和啟動(dòng)ZooKeeper并填寫地址揖膜。啟動(dòng)后便可以在0: jdbc:drill:zk=local>后敲入命令使用了。

試用

Drill的sample-data目錄有Parquet格式的演示數(shù)據(jù)可供查詢:

0: jdbc:drill:zk=local> select * from dfs.`/path/to/work/drill/apache-drill/sample-data/nation.parquet` limit 5;
+-------------+------------+-------------+------------+
| N_NATIONKEY |   N_NAME   | N_REGIONKEY | N_COMMENT  |
+-------------+------------+-------------+------------+
| 0           | ALGERIA    | 0           |  haggle. carefully f |
| 1           | ARGENTINA  | 1           | al foxes promise sly |
| 2           | BRAZIL     | 1           | y alongside of the p |
| 3           | CANADA     | 1           | eas hang ironic, sil |
| 4           | EGYPT      | 4           | y above the carefull |
+-------------+------------+-------------+------------+
5 rows selected (0.741 seconds)

這里用的庫(kù)名格式為dfs.`本地文件(Parquet梅桩、JSON壹粟、CSV等文件)絕對(duì)路徑`∷薨伲可以看出只要熟悉SQL語(yǔ)法幾乎沒有學(xué)習(xí)成本趁仙。但Parquet格式文件需要專用工具查看、編輯垦页,不是很方便雀费,后續(xù)再專門介紹,下文先使用更通用的CSV和JSON文件進(jìn)行演示痊焊。

$WORK/data中創(chuàng)建如下test.csv文件:

1101,SteveEurich,Steve,Eurich,16,StoreT
1102,MaryPierson,Mary,Pierson,16,StoreT
1103,LeoJones,Leo,Jones,16,StoreTem
1104,NancyBeatty,Nancy,Beatty,16,StoreT
1105,ClaraMcNight,Clara,McNight,16,Store

然后查詢:

0: jdbc:drill:zk=local> select * from dfs.`/path/to/work/drill/data/test.csv`;
+------------+
|  columns   |
+------------+
| ["1101","SteveEurich","Steve","Eurich","16","StoreT"] |
| ["1102","MaryPierson","Mary","Pierson","16","StoreT"] |
| ["1103","LeoJones","Leo","Jones","16","StoreTem"] |
| ["1104","NancyBeatty","Nancy","Beatty","16","StoreT"] |
| ["1105","ClaraMcNight","Clara","McNight","16","Store"] |
+------------+
5 rows selected (0.082 seconds)

可以看到結(jié)果和之前的稍有不同盏袄,因?yàn)镃SV文件沒有地方存放列列名,所以統(tǒng)一用columns代替薄啥,如果需要具體制定列則需要用columns[n]辕羽,如:

0: jdbc:drill:zk=local> select columns[0], columns[3] from dfs.`/path/to/work/drill/data/test.csv`;
+------------+------------+
|   EXPR$0   |   EXPR$1   |
+------------+------------+
| 1101       | Eurich     |
| 1102       | Pierson    |
| 1103       | Jones      |
| 1104       | Beatty     |
| 1105       | McNight    |
+------------+------------+

CSV文件格式比較簡(jiǎn)單,發(fā)揮不出Drill的強(qiáng)大優(yōu)勢(shì)垄惧,下邊更復(fù)雜的功能使用和Parquet更接近的JSON文件進(jìn)行演示刁愿。

$WORK/data中創(chuàng)建如下test.json文件:

{
  "ka1": 1,
  "kb1": 1.1,
  "kc1": "vc11",
  "kd1": [
    {
      "ka2": 10,
      "kb2": 10.1,
      "kc2": "vc1010"
    }
  ]
}
{
  "ka1": 2,
  "kb1": 2.2,
  "kc1": "vc22",
  "kd1": [
    {
      "ka2": 20,
      "kb2": 20.2,
      "kc2": "vc2020"
    }
  ]
}
{
  "ka1": 3,
  "kb1": 3.3,
  "kc1": "vc33",
  "kd1": [
    {
      "ka2": 30,
      "kb2": 30.3,
      "kc2": "vc3030"
    }
  ]
}

可以看到這個(gè)JSON文件內(nèi)容是有多層嵌套的,結(jié)構(gòu)比之前那個(gè)CSV文件要復(fù)雜不少到逊,而查詢嵌套數(shù)據(jù)正是Drill的優(yōu)勢(shì)所在铣口。

0: jdbc:drill:zk=local> select * from dfs.`/path/to/work/drill/data/test.json`;
+------------+------------+------------+------------+
|    ka1     |    kb1     |    kc1     |    kd1     |
+------------+------------+------------+------------+
| 1          | 1.1        | vc11       | [{"ka2":10,"kb2":10.1,"kc2":"vc1010"}] |
| 2          | 2.2        | vc22       | [{"ka2":20,"kb2":20.2,"kc2":"vc2020"}] |
| 3          | 3.3        | vc33       | [{"ka2":30,"kb2":30.3,"kc2":"vc3030"}] |
+------------+------------+------------+------------+
3 rows selected (0.098 seconds)

select *只查出第一層的數(shù)據(jù),更深層的數(shù)據(jù)只以原本的JSON數(shù)據(jù)呈現(xiàn)出來蕾管,我們顯然不應(yīng)該只關(guān)心第一層的數(shù)據(jù)枷踏,具體怎么查完全隨心所欲:

0: jdbc:drill:zk=local> select sum(ka1), avg(kd1[0].kb2) from dfs.`/path/to/work/drill/data/test.json`;
+------------+------------+
|   EXPR$0   |   EXPR$1   |
+------------+------------+
| 6          | 20.2       |
+------------+------------+
1 row selected (0.136 seconds)

可以通過kd1[0]來訪問嵌套到第二層的這個(gè)表。

0: jdbc:drill:zk=local> select kc1, kd1[0].kc2 from dfs.`/path/to/work/drill/data/test.json` where kd1[0].kb2 = 10.1 and ka1 = 1;
+------------+------------+
|    kc1     |   EXPR$1   |
+------------+------------+
| vc11       | vc1010     |
+------------+------------+
1 row selected (0.181 seconds)

創(chuàng)建view:

0: jdbc:drill:zk=local> create view dfs.tmp.tmpview as select kd1[0].kb2 from dfs.`/path/to/work/drill/data/test.json`;
+------------+------------+
|     ok     |  summary   |
+------------+------------+
| true       | View 'tmpview' created successfully in 'dfs.tmp' schema |
+------------+------------+
1 row selected (0.055 seconds)

0: jdbc:drill:zk=local> select * from dfs.tmp.tmpview;
+------------+
|   EXPR$0   |
+------------+
| 10.1       |
| 20.2       |
| 30.3       |
+------------+
3 rows selected (0.193 seconds)

可以把嵌套的第二層表打平(整合kd1[0]..kd1[n]):

0: jdbc:drill:zk=local> select kddb.kdtable.kc2 from (select flatten(kd1) kdtable from dfs.`/path/to/work/drill/data/test.json`) kddb;
+------------+
|   EXPR$0   |
+------------+
| vc1010     |
| vc2020     |
| vc3030     |
+------------+
3 rows selected (0.083 seconds)

使用細(xì)節(jié)上和mysql還是有所不同的掰曾,另外涉及到多層表的復(fù)雜邏輯旭蠕,要想用得得心應(yīng)手還需要仔細(xì)閱讀官方文檔并多多練習(xí)。這次先走馬觀花了旷坦,之后會(huì)深入了解語(yǔ)法層面的特性掏熬。

參考

付費(fèi)解決 Windows、Linux秒梅、Shell旗芬、C、C++捆蜀、AHK疮丛、Python幔嫂、JavaScript、Lua 等領(lǐng)域相關(guān)問題誊薄,靈活定價(jià)履恩,歡迎咨詢,微信 ly50247呢蔫。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末切心,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子片吊,更是在濱河造成了極大的恐慌绽昏,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件俏脊,死亡現(xiàn)場(chǎng)離奇詭異全谤,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)联予,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門啼县,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人沸久,你說我怎么就攤上這事∮嘈罚” “怎么了卷胯?”我有些...
    開封第一講書人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)威酒。 經(jīng)常有香客問我窑睁,道長(zhǎng),這世上最難降的妖魔是什么葵孤? 我笑而不...
    開封第一講書人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任担钮,我火速辦了婚禮,結(jié)果婚禮上尤仍,老公的妹妹穿的比我還像新娘箫津。我一直安慰自己,他們只是感情好宰啦,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開白布苏遥。 她就那樣靜靜地躺著,像睡著了一般赡模。 火紅的嫁衣襯著肌膚如雪田炭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,262評(píng)論 1 308
  • 那天漓柑,我揣著相機(jī)與錄音教硫,去河邊找鬼叨吮。 笑死,一個(gè)胖子當(dāng)著我的面吹牛瞬矩,可吹牛的內(nèi)容都是我干的茶鉴。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼丧鸯,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼蛤铜!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起丛肢,我...
    開封第一講書人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤围肥,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后蜂怎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體穆刻,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年杠步,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了氢伟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡幽歼,死狀恐怖朵锣,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情甸私,我是刑警寧澤诚些,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站皇型,受9級(jí)特大地震影響诬烹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜弃鸦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一绞吁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧唬格,春花似錦家破、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至藕畔,卻和暖如春马僻,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背注服。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工韭邓, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留措近,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓女淑,卻偏偏與公主長(zhǎng)得像瞭郑,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鸭你,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容