日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

如何指南:Apache Drill入门

發(fā)布時(shí)間:2023/12/3 编程问答 63 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何指南:Apache Drill入门 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Apache Drill是一種引擎,可以連接到許多不同的數(shù)據(jù)源,并為它們提供SQL接口。 它不僅是想跳入任何復(fù)雜事物的SQL接口,而且是一個(gè)功能強(qiáng)大的接口, 其中包括對許多內(nèi)置函數(shù)和窗口函數(shù)的支持。 盡管它可以連接到您仍然可以使用SQL查詢的標(biāo)準(zhǔn)數(shù)據(jù)源(例如Oracle或MySQL),但它也可以處理諸如CSV或JSON之類的平面文件以及Avro和Parquet格式。 正是這種針對文件運(yùn)行SQL的能力首先激發(fā)了我對Apache Drill的興趣。 我花了大量時(shí)間研究大數(shù)據(jù)架構(gòu)和工具,包括大數(shù)據(jù)發(fā)現(xiàn) 。 在此過程中,嘗試數(shù)據(jù)管道選項(xiàng)是我發(fā)現(xiàn)的空白之一,那就是在將它們引入Hive之類的東西之前,可以以原始狀態(tài)挖掘文件的功能,這將使他們能夠通過BDD和其他工具。

在本文中,我將逐步介紹Apache Drill的入門知識,并展示一些我認(rèn)為是其有用性的絕佳示例。

入門

開始使用Apache Drill非常簡單–只需下載并解壓縮并運(yùn)行即可。 雖然它可以跨機(jī)器分布運(yùn)行以提高性能,但也可以在筆記本電腦上獨(dú)立運(yùn)行。

啟動它

cd /opt/apache-drill-1.7.0/ bin/sqlline -u jdbc:drill:zk=local

如果您No current connection或com.fasterxml.jackson.databind.JavaType.isReferenceType()Z則您遇到?jīng)_突的JAR問題 (例如,我在Oracle BigDataLite VM上遇到此問題 ),應(yīng)在干凈的環(huán)境下啟動它

env -i HOME="$HOME" LC_CTYPE="${LC_ALL:-${LC_CTYPE:-$LANG}}" PATH="$PATH" USER="$USER" /opt/apache-drill-1.7.0/bin/drill-embedded

有一個(gè)內(nèi)置數(shù)據(jù)集可用于測試:

USE cp; SELECT employee_id, first_name FROM `employee.json` limit 5;

如果您習(xí)慣使用SQL * Plus和類似的工具,那么在非常熟悉的環(huán)境中,這應(yīng)該返回五行:

0: jdbc:drill:zk=local> USE cp; +-------+---------------------------------+ | ok | summary | +-------+---------------------------------+ | true | Default schema changed to [cp] | +-------+---------------------------------+ 1 row selected (1.776 seconds) 0: jdbc:drill:zk=local> SELECT employee_id, first_name FROM `employee.json` limit 5; +--------------+-------------+ | employee_id | first_name | +--------------+-------------+ | 1 | Sheri | | 2 | Derrick | | 4 | Michael | | 5 | Maya | | 6 | Roberta | +--------------+-------------+ 5 rows selected (3.624 seconds)

到目前為止,是如此的SQL,如此的關(guān)系-如此熟悉,真的。 Apache Drill開始偏離明顯之處的是它對存儲處理程序的使用。 在上面的查詢中,cp是我們要對其運(yùn)行查詢的“數(shù)據(jù)庫”,但實(shí)際上這是默認(rèn)情況下定義的“類路徑”(因此稱為“ cp”)存儲處理程序。 在“數(shù)據(jù)庫”中,存在“方案”,它們是存儲處理程序的子配置。 稍后我們將查看和定義這些內(nèi)容。 現(xiàn)在,知道您還可以列出可用的數(shù)據(jù)庫很有用:

0: jdbc:drill:zk=local> show databases; +---------------------+ | SCHEMA_NAME | +---------------------+ | INFORMATION_SCHEMA | | cp.default | | dfs.default | | dfs.root | | dfs.tmp | | sys | +---------------------+

注意databases命令是schemas的同義詞; 兩者都返回的是<database>.<schema> 。 在Apache Drill中,反引號用于封裝標(biāo)識符(例如模式名稱,列名稱等),并且它非常具體。 例如,這是有效的:

0: jdbc:drill:zk=local> USE `cp.default`; +-------+-----------------------------------------+ | ok | summary | +-------+-----------------------------------------+ | true | Default schema changed to [cp.default] | +-------+-----------------------------------------+ 1 row selected (0.171 seconds)

雖然不是:

0: jdbc:drill:zk=local> USE cp.default; Error: PARSE ERROR: Encountered ". default" at line 1, column 7. Was expecting one of: <EOF> "." <IDENTIFIER> ... "." <QUOTED_IDENTIFIER> ... "." <BACK_QUOTED_IDENTIFIER> ... "." <BRACKET_QUOTED_IDENTIFIER> ... "." <UNICODE_QUOTED_IDENTIFIER> ... "." "*" ...SQL Query USE cp.default

這是因?yàn)閐efault是保留字,因此必須加引號。 因此,您也可以使用

0: jdbc:drill:zk=local> use cp.`default`;

但不是

0: jdbc:drill:zk=local> use `cp`.default;

查詢JSON數(shù)據(jù)

在Apache Drill網(wǎng)站上有一些有用的教程 ,其中包括一個(gè)使用Yelp提供的數(shù)據(jù)的教程 。 這是最初使我著眼于Drill的數(shù)據(jù)集,因?yàn)槲覍⑵溆米鞔髷?shù)據(jù)發(fā)現(xiàn) (BDD)的輸入,但在兩個(gè)方面都遇到了困難。 首先是如何最好地在其上定義合適的Hive表,以便將其提取到BDD中。 從此之后,我們試圖了解數(shù)據(jù)中可能具有什么價(jià)值,這將使我花多長時(shí)間來完善我在Hive中公開數(shù)據(jù)的方式。 以下示例顯示了以表格形式查詢時(shí),復(fù)雜JSON可能帶來的復(fù)雜性。

首先,查詢JSON文件,并自動推斷出架構(gòu)。 很酷

0: jdbc:drill:zk=local> select * from `/user/oracle/incoming/yelp/tip_json/yelp_academic_dataset_tip.json` limit 5; +---------+------+-------------+-------+------+------+ | user_id | text | business_id | likes | date | type | +---------+------+-------------+-------+------+------+ | -6rEfobYjMxpUWLNxszaxQ | Don't waste your time. | cE27W9VPgO88Qxe4ol6y_g | 0 | 2013-04-18 | tip | | EZ0r9dKKtEGVx2CdnowPCw | Your GPS will not allow you to find this place. Put Rankin police department in instead. They are directly across the street. | mVHrayjG3uZ_RLHkLj-AMg | 1 | 2013-01-06 | tip | | xb6zEQCw9I-Gl0g06e1KsQ | Great drink specials! | KayYbHCt-RkbGcPdGOThNg | 0 | 2013-12-03 | tip | | QawZN4PSW7ng_9SP7pjsVQ | Friendly staff, good food, great beer selection, and relaxing atmosphere | KayYbHCt-RkbGcPdGOThNg | 0 | 2015-07-08 | tip | | MLQre1nvUtW-RqMTc4iC9A | Beautiful restoration. | 1_lU0-eSWJCRvNGk78Zh9Q | 0 | 2015-10-25 | tip | +---------+------+-------------+-------+------+------+ 5 rows selected (2.341 seconds)

我們可以使用標(biāo)準(zhǔn)的SQL聚合,例如COUNT :

0: jdbc:drill:zk=local> select count(*) from `/user/oracle/incoming/yelp/tip_json/yelp_academic_dataset_tip.json`; +---------+ | EXPR$0 | +---------+ | 591864 | +---------+ 1 row selected (4.495 seconds)

以及GROUP BY操作:

0: jdbc:drill:zk=local> select `date`,count(*) as tip_count from `/user/oracle/incoming/yelp/tip_json/yelp_academic_dataset_tip.json` group by `date` order by 2 desc limit 5; +-------------+------------+ | date | tip_count | +-------------+------------+ | 2012-07-21 | 719 | | 2012-05-19 | 718 | | 2012-08-04 | 699 | | 2012-06-23 | 690 | | 2012-07-28 | 682 | +-------------+------------+ 5 rows selected (7.111 seconds)

稍微研究一下數(shù)據(jù),我們可以看到它并不完全平坦–請注意,例如hours列,它是一個(gè)嵌套的JSON對象:

0: jdbc:drill:zk=local> select full_address,city,hours from `/user/oracle/incoming/yelp/business_json` b limit 5; +--------------+------+-------+ | full_address | city | hours | +--------------+------+-------+ | 4734 Lebanon Church Rd Dravosburg, PA 15034 | Dravosburg | {"Friday":{"close":"21:00","open":"11:00"},"Tuesday":{"close":"21:00","open":"11:00"},"Thursday":{"close":"21:00","open":"11:00"},"Wednesday":{"close":"21:00","open":"11:00"},"Monday":{"close":"21:00","open":"11:00"},"Sunday":{},"Saturday":{}} | | 202 McClure St Dravosburg, PA 15034 | Dravosburg | {"Friday":{},"Tuesday":{},"Thursday":{},"Wednesday":{},"Monday":{},"Sunday":{},"Saturday":{}} | | 1 Ravine St Dravosburg, PA 15034 | Dravosburg | {"Friday":{},"Tuesday":{},"Thursday":{},"Wednesday":{},"Monday":{},"Sunday":{},"Saturday":{}} | | 1530 Hamilton Rd Bethel Park, PA 15234 | Bethel Park | {"Friday":{},"Tuesday":{},"Thursday":{},"Wednesday":{},"Monday":{},"Sunday":{},"Saturday":{}} | | 301 South Hills Village Pittsburgh, PA 15241 | Pittsburgh | {"Friday":{"close":"17:00","open":"10:00"},"Tuesday":{"close":"21:00","open":"10:00"},"Thursday":{"close":"17:00","open":"10:00"},"Wednesday":{"close":"21:00","open":"10:00"},"Monday":{"close":"21:00","open":"10:00"},"Sunday":{"close":"18:00","open":"11:00"},"Saturday":{"close":"21:00","open":"10:00"}} | +--------------+------+-------+ 5 rows selected (0.721 seconds) 0: jdbc:drill:zk=local>

使用Apache Drill,我們可以簡單地使用點(diǎn)表示法來訪問嵌套值。 在執(zhí)行此操作時(shí),必須為表加上別名(在本示例中為b ):

0: jdbc:drill:zk=local> select b.hours from `/user/oracle/incoming/yelp/business_json` b limit 1; +-------+ | hours | +-------+ | {"Friday":{"close":"21:00","open":"11:00"},"Tuesday":{"close":"21:00","open":"11:00"},"Thursday":{"close":"21:00","open":"11:00"},"Wednesday":{"close":"21:00","open":"11:00"},"Monday":{"close":"21:00","open":"11:00"},"Sunday":{},"Saturday":{}} | +-------+

嵌套對象本身可以嵌套-Apache Drill并不存在問題,我們只是將點(diǎn)符號進(jìn)一步鏈接起來:

0: jdbc:drill:zk=local> select b.hours.Friday from `/user/oracle/incoming/yelp/business_json` b limit 1; +-----------------------------------+ | EXPR$0 | +-----------------------------------+ | {"close":"21:00","open":"11:00"} | +-----------------------------------+ 1 row selected (0.238 seconds)

注意,使用反引號( ` )引用保留的open和close關(guān)鍵字:

0: jdbc:drill:zk=local> select b.hours.Friday.`open`,b.hours.Friday.`close` from `/user/oracle/incoming/yelp/business_json` b limit 1; +---------+---------+ | EXPR$0 | EXPR$1 | +---------+---------+ | 11:00 | 21:00 | +---------+---------+ 1 row selected (0.58 seconds)

嵌套列本身就是查詢中的適當(dāng)對象,也可以用作謂詞:

0: jdbc:drill:zk=local> select b.name,b.full_address,b.hours.Friday.`open` from `/user/oracle/incoming/yelp/business_json` b where b.hours.Friday.`open` = '11:00' limit 5; +------------------------+------------------------------------------------+---------+ | name | full_address | EXPR$2 | +------------------------+------------------------------------------------+---------+ | Mr Hoagie | 4734 Lebanon Church Rd Dravosburg, PA 15034 | 11:00 | | Alexion's Bar & Grill | 141 Hawthorne St Greentree Carnegie, PA 15106 | 11:00 | | Rocky's Lounge | 1201 Washington Ave Carnegie, PA 15106 | 11:00 | | Papa J's | 200 E Main St Carnegie Carnegie, PA 15106 | 11:00 | | Italian Village Pizza | 2615 Main St Homestead, PA 15120 | 11:00 | +------------------------+------------------------------------------------+---------+ 5 rows selected (0.404 seconds)

您會在上面的輸出中注意到full_address字段中包含換行符—我們可以使用SQL函數(shù)用逗號替換換行符:

0: jdbc:drill:zk=local> select b.name,regexp_replace(b.full_address,'\n',','),b.hours.Friday.`open` from `/user/oracle/incoming/yelp/business_json` b where b.hours.Friday.`open` = '11:00' limit 5; +------------------------+------------------------------------------------+---------+ | name | EXPR$1 | EXPR$2 | +------------------------+------------------------------------------------+---------+ | Mr Hoagie | 4734 Lebanon Church Rd,Dravosburg, PA 15034 | 11:00 | | Alexion's Bar & Grill | 141 Hawthorne St,Greentree,Carnegie, PA 15106 | 11:00 | | Rocky's Lounge | 1201 Washington Ave,Carnegie, PA 15106 | 11:00 | | Papa J's | 200 E Main St,Carnegie,Carnegie, PA 15106 | 11:00 | | Italian Village Pizza | 2615 Main St,Homestead, PA 15120 | 11:00 | +------------------------+------------------------------------------------+---------+ 5 rows selected (1.346 seconds)

查詢聯(lián)合

因此,Apache Drill使您能夠?qū)Χ喾N格式和位置的數(shù)據(jù)運(yùn)行SQL查詢,這本身就非常有用。 但比這更好的是,它使您可以在單個(gè)查詢中聯(lián)合這些源。 這是在HDFS和Oracle中的數(shù)據(jù)之間進(jìn)行聯(lián)接的示例:

0: jdbc:drill:zk=local> select X.text, . . . . . . . . . . . > Y.NAME . . . . . . . . . . . > from hdfs.`/user/oracle/incoming/yelp/tip_json/yelp_academic_dataset_tip.json` X . . . . . . . . . . . > inner join ora.MOVIEDEMO.YELP_BUSINESS Y . . . . . . . . . . . > on X.business_id = Y.BUSINESS_ID . . . . . . . . . . . > where Y.NAME = 'Chick-fil-A' . . . . . . . . . . . > limit 5; +--------------------------------------------------------------------+--------------+ | text | NAME | +--------------------------------------------------------------------+--------------+ | It's daddy daughter date night here and they go ALL OUT! | Chick-fil-A | | Chicken minis! The best part of waking up Saturday mornings. :) | Chick-fil-A | | Nice folks as always unlike those ghetto joints | Chick-fil-A | | Great clean and delicious chicken sandwiches! | Chick-fil-A | | Spicy Chicken with lettuce, tomato, and pepperjack cheese FTW! | Chick-fil-A | +--------------------------------------------------------------------+--------------+ 5 rows selected (3.234 seconds)

您可以為此定義一個(gè)視圖:

0: jdbc:drill:zk=local> create or replace view dfs.tmp.yelp_tips as select X.text as tip_text, Y.NAME as business_name from hdfs.`/user/oracle/incoming/yelp/tip_json/yelp_academic_dataset_tip.json` X inner join ora.MOVIEDEMO.YELP_BUSINESS Y on X.business_id = Y.BUSINESS_ID ; +-------+-------------------------------------------------------------+ | ok | summary | +-------+-------------------------------------------------------------+ | true | View 'yelp_tips' replaced successfully in 'dfs.tmp' schema | +-------+-------------------------------------------------------------+ 1 row selected (0.574 seconds) 0: jdbc:drill:zk=local> describe dfs.tmp.yelp_tips; +----------------+--------------------+--------------+ | COLUMN_NAME | DATA_TYPE | IS_NULLABLE | +----------------+--------------------+--------------+ | tip_text | ANY | YES | | business_name | CHARACTER VARYING | YES | +----------------+--------------------+--------------+ 2 rows selected (0.756 seconds)

然后將其作為任何常規(guī)對象進(jìn)行查詢:

0: jdbc:drill:zk=local> select tip_text,business_name from dfs.tmp.yelp_tips where business_name like '%Grill' limit 5; +------+------+ | text | NAME | +------+------+ | Great drink specials! | Alexion's Bar & Grill | | Friendly staff, good food, great beer selection, and relaxing atmosphere | Alexion's Bar & Grill | | Pretty quiet here... | Uno Pizzeria & Grill | | I recommend this location for quick lunches. 10 min or less lunch menu. Soup bar ( all you can eat) the broccoli cheddar soup is delicious. | Uno Pizzeria & Grill | | Instead of pizza, come here for dessert. The deep dish sundae is really good. | Uno Pizzeria & Grill | +------+------+ 5 rows selected (3.272 seconds)

查詢Twitter JSON數(shù)據(jù)

這是一個(gè)使用Drill查詢包含一些Twitter數(shù)據(jù)的本地文件的示例。 如果您想嘗試自己查詢文件,可以在這里下載文件 。

首先,我切換到使用dfs存儲插件:

0: jdbc:drill:zk=local> use dfs; +-------+----------------------------------+ | ok | summary | +-------+----------------------------------+ | true | Default schema changed to [dfs] | +-------+----------------------------------+

然后嘗試對文件進(jìn)行選擇。 注意limit 5子句–僅在檢查文件結(jié)構(gòu)時(shí)非常有用。

0: jdbc:drill:zk=local> select * from `/user/oracle/incoming/twitter/geo_tweets.json` limit 5; Error: DATA_READ ERROR: Error parsing JSON - Unexpected end-of-input within/between OBJECT entriesFile /user/oracle/incoming/twitter/geo_tweets.json Record 2819 Column 3503 Fragment 0:0

一個(gè)錯(cuò)誤? 那不應(yīng)該發(fā)生的。 我有一個(gè)JSON文件,對不對? 事實(shí)證明,JSON文件是每行一個(gè)完整的JSON對象。 除了不在最后一個(gè)記錄上。 請注意上面的錯(cuò)誤– 2819中給出的記錄計(jì)數(shù):

[oracle@bigdatalite ~]$ wc -l geo_tweets.json 2818 geo_tweets.json

因此,該文件只有2818條完整的行。 嗯 讓我們使用頭/尾巴打擊組合查看該記錄:

[oracle@bigdatalite ~]$ head -n 2819 geo_tweets.json |tail -n1 {"created_at":"Sun Jul 24 21:00:44 +0000 2016","id":757319630432067584,"id_str":"757319630432067584","text":"And now @HillaryClinton hires @DWStweets: Honorary Campaign Manager across the USA #corruption #hillarysamerica https://t.co/8jAGUu6w2f","source":"TweetCaster for iOS","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":2170786369,"id_str":"2170786369","name":"Patricia Weber","screen_name":"InnieBabyBoomer","location":"Williamsburg, VA","url":"http://lovesrantsandraves.blogspot.com/","description":"Baby Boomer, Swing Voter, Conservative, Spiritual, #Introvert, Wife, Grandma, Italian, ? Books, Cars, Ferrari, F1 Race? #tcot","protected":false,"verified":false,"followers_count":861,"friends_count":918,"listed_count":22,"favourites_count":17,"statuses_count":2363,"created_at":"Sat Nov 02 19:13:06 +0000 2013","utc_offset":null,"time_zone":null,"geo_enabled":true,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"C0DEED","profile_background_image_url":"http://pbs.twimg.com/profile_background_images/378800000107659131/3589f

這就是文件中的完整數(shù)據(jù)-所以Drill是正確的-JSON已損壞。 如果我們刪除最后一條記錄并創(chuàng)建一個(gè)新文件( geo_tweets.fixed.json )

然后再次查詢,我們得到了一些東西!

0: jdbc:drill:zk=local> select text from `/users/rmoff/data/geo_tweets.fixed.json` limit 5; +------+ | text | +------+ | Vancouver trends now: Trump, Evander Kane, Munich, 2016HCC and dcc16. https://t.co/joI9GMfRim | | We're #hiring! Click to apply: Bench Jeweler - SEC Oracle & Wetmore - https://t.co/Oe2SHaL0Hh #Job #SkilledTrade #Tucson, AZ #Jobs | | Donald Trump accepted the Republican nomination last night. Isis claimed responsibility. | | Obama: "We must stand together and stop terrorism" Trump: "We don't want these people in our country"| | Someone built a wall around Trump's star on the Hollywood Walk of Fame. #lol #nowthatsfunny @… https://t.co/qHWuJXnzbw | +------+ 5 rows selected (0.246 seconds)

此處的text是json字段之一。 我可以select *但不是很清楚:

0: jdbc:drill:zk=local> select * from `/users/rmoff/data/geo_tweets.fixed.json` limit 5; +------------+----+--------+------+--------+-----------+------+-----+-------------+-------+-----------------+---------------+----------------+----------+-----------+-----------+--------------------+--------------+------+--------------+----------+------------+-----------+------------------+----------------------+--------------------+-------------------+-----------------------+---------------------+-----------------+------------+---------------+---------------+------------+-----------+--------------------------------+-----------+----------+----------------+-------------------+---------------------------------+-----------------------+---------------------------+---------------------+-------------------------+-------------------------+------------------+-----------------------+------------------+----------------------+---------------+ | created_at | id | id_str | text | source | truncated | user | geo | coordinates | place | is_quote_status | retweet_count | favorite_count | entities | favorited | retweeted | possibly_sensitive | filter_level | lang | timestamp_ms | @version | @timestamp | user_name | user_screen_name | user_followers_count | user_friends_count | user_listed_count | user_favourites_count | user_statuses_count | user_created_at | place_name | place_country | hashtags_list | urls_array | urls_list | user_mentions_screen_name_list | longitude | latitude | hashtags_array | extended_entities | user_mentions_screen_name_array | in_reply_to_status_id | in_reply_to_status_id_str | in_reply_to_user_id | in_reply_to_user_id_str | in_reply_to_screen_name | retweeted_status | retweeted_screen_name | quoted_status_id | quoted_status_id_str | quoted_status | +------------+----+--------+------+--------+-----------+------+-----+-------------+-------+-----------------+---------------+----------------+----------+-----------+-----------+--------------------+--------------+------+--------------+----------+------------+-----------+------------------+----------------------+--------------------+-------------------+-----------------------+---------------------+-----------------+------------+---------------+---------------+------------+-----------+--------------------------------+-----------+----------+----------------+-------------------+---------------------------------+-----------------------+---------------------------+---------------------+-------------------------+-------------------------+------------------+-----------------------+------------------+----------------------+---------------+ | Fri Jul 22 19:37:11 +0000 2016 | 756573827589545984 | 756573827589545984 | Vancouver trends now: Trump, Evander Kane, Munich, 2016HCC and dcc16. https://t.co/joI9GMfRim | dlvr.it | false | {"id":67898674,"id_str":"67898674","name":"Vancouver Press","screen_name":"Vancouver_CP","location":"Vancouver, BC","url":"http://vancouver.cityandpress.com/","description":"Latest news from Vancouver. Updates are frequent.","protected":false,"verified":false,"followers_count":807,"friends_count":13,"listed_count":94,"favourites_count":1,"statuses_count":131010,"created_at":"Sat Aug 22 14:25:37 +0000 2009","utc_offset":-25200,"time_zone":"Pacific Time (US & Canada)","geo_enabled":true,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"FFFFFF","profile_background_image_url":"http://abs.twimg.com/images/themes/theme1/bg.png","profile_background_image_url_https":"https://abs.twimg.com/images/themes/theme1/bg.png","profile_background_tile":false,"profile_link_color":"8A1C3B","profile_sidebar_border_color":"FFFFFF","profile_sidebar_fill_color":"FFFFFF","profile_text_color":"2A2C31","profile_use_background_image":false,"profile_image_url":"http://pbs.twimg.com/profile_images/515841109553983490/_t0QWPco_normal.png","profile_image_url_https":"https://pbs.twimg.com/profile_images/515841109553983490/_t0QWPco_normal.png","profile_banner_url":"https://pbs.twimg.com/profile_banners/67898674/1411821103","default_profile":false,"default_profile_image":false} | {"type":"Point","coordinates":[49.2814375,-123.12109067]} | {"type":"Point","coordinates":[-123.12109067,49.2814375]} | {"id":"1e5cb4d0509db554","url":"https://api.twitter.com/1.1/geo/id/1e5cb4d0509db554.json","place_type":"city","name":"Vancouver","full_name":"Vancouver, British Columbia","country_code":"CA","country":"Canada","bounding_box":{"type":"Polygon","coordinates":[[[-123.224215,49.19854],[-123.224215,49.316738],[-123.022947,49.316738],[-123.022947,49.19854]]]},"attributes":{}} | false | 0 | 0 | {"urls":[{"url":"https://t.co/joI9GMfRim","expanded_url":"http://toplocalnow.com/ca/vancouver?section=trends","display_url":"toplocalnow.com/ca/vancouver?s…","indices":[70,93]}],"hashtags":[],"user_mentions":[],"media":[],"symbols":[]} | false | false | false | low | en | 1469216231616 | 1 | 2016-07-22T19:37:11.000Z | Vancouver Press | Vancouver_CP | 807 | 13 | 94 | 1 | 131010 | Sat Aug 22 14:25:37 +0000 2009 | Vancouver | Canada | | ["toplocalnow.com/ca/vancouver?s…"] | toplocalnow.com/ca/vancouver?s… | | -123.12109067 | 49.2814375 | [] | {"media":[]} | [] | null | null | null | null | null | {"user":{},"entities":{"user_mentions":[],"media":[],"hashtags":[],"urls":[]},"extended_entities":{"media":[]},"quoted_status":{"user":{},"entities":{"hashtags":[],"user_mentions":[],"media":[],"urls":[]},"extended_entities":{"media":[]}}} | null | null | null | {"user":{},"entities":{"user_mentions":[],"media":[],"urls":[],"hashtags":[]},"extended_entities":{"media":[]},"place":{"bounding_box":{"coordinates":[]},"attributes":{}},"geo":{"coordinates":[]},"coordinates":{"coordinates":[]}} |

在twitter數(shù)據(jù)中,存在根級字段(例如text )以及嵌套字段(例如user字段中有關(guān)高音揚(yáng)聲器的信息)。 正如我們在上面看到的,您使用點(diǎn)表示法引用了嵌套字段。 現(xiàn)在是指出您可能遇到的幾個(gè)常見錯(cuò)誤的好時(shí)機(jī)。 首先是不引用保留字,而是檢查是否Encountered "."諸如“ Encountered "."類的錯(cuò)誤的第一件事Encountered "." :

0: jdbc:drill:zk=local> select user.screen_name,text from `/users/rmoff/data/geo_tweets.fixed.json` limit 5; Error: PARSE ERROR: Encountered "." at line 1, column 12. [...]

其次是在使用點(diǎn)表示法時(shí)聲明表別名-如果您不這樣做,則Apache Drill會認(rèn)為父列實(shí)際上是表名( VALIDATION ERROR: [...] Table 'user' not found ):

0: jdbc:drill:zk=local> select `user`.screen_name,text from dfs.`/users/rmoff/data/geo_tweets.fixed.json` limit 5; Aug 10, 2016 11:16:45 PM org.apache.calcite.sql.validate.SqlValidatorException SEVERE: org.apache.calcite.sql.validate.SqlValidatorException: Table 'user' not found Aug 10, 2016 11:16:45 PM org.apache.calcite.runtime.CalciteException SEVERE: org.apache.calcite.runtime.CalciteContextException: From line 1, column 8 to line 1, column 13: Table 'user' not found Error: VALIDATION ERROR: From line 1, column 8 to line 1, column 13: Table 'user' not foundSQL Query null[Error Id: 1427fd23-e180-40be-a751-b6f1f838233a on 192.168.56.1:31010] (state=,code=0)

修正了這些錯(cuò)誤之后,我們可以看到用戶的屏幕名稱:

0: jdbc:drill:zk=local> select tweets.`user`.`screen_name` as user_screen_name,text from dfs.`/users/rmoff/data/geo_tweets.fixed.json` tweets limit 2; +------------------+------+ | user_screen_name | text | +------------------+------+ | Vancouver_CP | Vancouver trends now: Trump, Evander Kane, Munich, 2016HCC and dcc16. https://t.co/joI9GMfRim | | tmj_TUC_skltrd | We're #hiring! Click to apply: Bench Jeweler - SEC Oracle & Wetmore - https://t.co/Oe2SHaL0Hh #Job #SkilledTrade #Tucson, AZ #Jobs | +------------------+------+ 2 rows selected (0.256 seconds) 0: jdbc:drill:zk=local>

除了嵌套對象,JSON還支持?jǐn)?shù)組。 Twitter數(shù)據(jù)中的一個(gè)示例是#標(biāo)簽或URL,在給定的tweet中,兩者都可以為零,一個(gè)或多個(gè)。

0: jdbc:drill:zk=local> select tweets.entities.hashtags from dfs.`/users/rmoff/data/geo_tweets.fixed.json` tweets limit 5; +--------+ | EXPR$0 | +--------+ | [] | | [{"text":"hiring","indices":[6,13]},{"text":"Job","indices":[98,102]},{"text":"SkilledTrade","indices":[103,116]},{"text":"Tucson","indices":[117,124]},{"text":"Jobs","indices":[129,134]}] | | [] | | [] | | [{"text":"lol","indices":[72,76]},{"text":"nowthatsfunny","indices":[77,91]}] | +--------+ 5 rows selected (0.286 seconds)

使用FLATTEN函數(shù),每個(gè)數(shù)組條目都會變成一個(gè)新行,因此:

0: jdbc:drill:zk=local> select flatten(tweets.entities.hashtags) from dfs.`/users/rmoff/data/geo_tweets.fixed.json` tweets limit 5; +----------------------------------------------+ | EXPR$0 | +----------------------------------------------+ | {"text":"hiring","indices":[6,13]} | | {"text":"Job","indices":[98,102]} | | {"text":"SkilledTrade","indices":[103,116]} | | {"text":"Tucson","indices":[117,124]} | | {"text":"Jobs","indices":[129,134]} | +----------------------------------------------+ 5 rows selected (0.139 seconds)

請注意, limit 5子句僅顯示前五個(gè)數(shù)組實(shí)例,實(shí)際上這只是上述列表中第一個(gè)tweet的主題標(biāo)簽。

要訪問主題標(biāo)簽的文本,我們使用子查詢和點(diǎn)表示法來訪問text字段:

0: jdbc:drill:zk=local> select ent_hashtags.hashtags.text from (select flatten(tweets.entities.hashtags) as hashtags from dfs.`/users/rmoff/data/geo_tweets.fixed.json` tweets) as ent_hashtags limit 5; +---------------+ | EXPR$0 | +---------------+ | hiring | | Job | | SkilledTrade | | Tucson | | Jobs | +---------------+ 5 rows selected (0.168 seconds)

對于相同的結(jié)果,可以使用通用表表達(dá)式 (CTE,也稱為子查詢分解)來提高可讀性:

0: jdbc:drill:zk=local> with ent_hashtags as (select flatten(tweets.entities.hashtags) as hashtags from dfs.`/users/rmoff/data/geo_tweets.fixed.json` tweets) . . . . . . . . . . . > select ent_hashtags.hashtags.text from ent_hashtags . . . . . . . . . . . > limit 5; +---------------+ | EXPR$0 | +---------------+ | hiring | | Job | | SkilledTrade | | Tucson | | Jobs | +---------------+ 5 rows selected (0.253 seconds)

將展平的數(shù)組與現(xiàn)有字段結(jié)合起來,使我們能夠看到類似推文列表及其相關(guān)主題標(biāo)簽的內(nèi)容:

0: jdbc:drill:zk=local> with tmp as ( select flatten(tweets.entities.hashtags) as hashtags,tweets.text,tweets.`user`.screen_name as user_screen_name from dfs.`/users/rmoff/data/geo_tweets.fixed.json` tweets) select tmp.user_screen_name,tmp.text,tmp.hashtags.text as hashtag from tmp limit 10; +------------------+------+---------+ | user_screen_name | text | hashtag | +------------------+------+---------+ | tmj_TUC_skltrd | We're #hiring! Click to apply: Bench Jeweler - SEC Oracle & Wetmore - https://t.co/Oe2SHaL0Hh #Job #SkilledTrade #Tucson, AZ #Jobs | hiring | | tmj_TUC_skltrd | We're #hiring! Click to apply: Bench Jeweler - SEC Oracle & Wetmore - https://t.co/Oe2SHaL0Hh #Job #SkilledTrade #Tucson, AZ #Jobs | Job | | tmj_TUC_skltrd | We're #hiring! Click to apply: Bench Jeweler - SEC Oracle & Wetmore - https://t.co/Oe2SHaL0Hh #Job #SkilledTrade #Tucson, AZ #Jobs | SkilledTrade | | tmj_TUC_skltrd | We're #hiring! Click to apply: Bench Jeweler - SEC Oracle & Wetmore - https://t.co/Oe2SHaL0Hh #Job #SkilledTrade #Tucson, AZ #Jobs | Tucson | | tmj_TUC_skltrd | We're #hiring! Click to apply: Bench Jeweler - SEC Oracle & Wetmore - https://t.co/Oe2SHaL0Hh #Job #SkilledTrade #Tucson, AZ #Jobs | Jobs | | johnmayberry | Someone built a wall around Trump's star on the Hollywood Walk of Fame. #lol #nowthatsfunny @… https://t.co/qHWuJXnzbw | lol | | johnmayberry | Someone built a wall around Trump's star on the Hollywood Walk of Fame. #lol #nowthatsfunny @… https://t.co/qHWuJXnzbw | nowthatsfunny | | greensboro_nc | #WinstonSalem Time and place announced for Donald Trump's visit to… https://t.co/6OVl7crshw #ws @winston_salem_ https://t.co/l5h220otj4 | WinstonSalem | | greensboro_nc | #WinstonSalem Time and place announced for Donald Trump's visit to… https://t.co/6OVl7crshw #ws @winston_salem_ https://t.co/l5h220otj4 | ws | | trendinaliaSG | 6. Hit The Stage 7. TTTT 8. Demi Lovato 9. Beijing 10. Donald Trump2016/7/23 03:36 SGT #trndnl https://t.co/psP0GzBgZB | trndnl | +------------------+------+---------+ 10 rows selected (0.166 seconds)

我們還可以根據(jù)主題標(biāo)簽進(jìn)行過濾:

0: jdbc:drill:zk=local> with tmp as ( select flatten(tweets.entities.hashtags) as hashtags,tweets.text,tweets.`user`.screen_name as user_screen_name from dfs.`/users/rmoff/data/geo_tweets.fixed.json` tweets) select tmp.user_screen_name,tmp.text,tmp.hashtags.text as hashtag from tmp where tmp.hashtags.text = 'Job' limit 5; +------------------+------+---------+ | user_screen_name | text | hashtag | +------------------+------+---------+ | tmj_TUC_skltrd | We're #hiring! Click to apply: Bench Jeweler - SEC Oracle & Wetmore - https://t.co/Oe2SHaL0Hh #Job #SkilledTrade #Tucson, AZ #Jobs | Job | | tmj_VAL_health | Want to work at Genesis Rehab Services? We're #hiring in #Clinton, MD! Click for details: https://t.co/4lt7I4gMZk #Job #Healthcare #Jobs | Job | | tmj_in_retail | Want to work in #Clinton, IN? View our latest opening: https://t.co/UiimnlubYs #Job #Retail #Jobs #Hiring #CareerArc | Job | | tmj_la_hrta | Want to work at SONIC Drive-In? We're #hiring in #Clinton, LA! Click for details: https://t.co/aQ1FrWc7iR #Job #SONIC #Hospitality #Jobs | Job | | tmj_ia_hrta | We're #hiring! Click to apply: Department Manager - https://t.co/SnoKcwwHFk #Job #Hospitality #Clinton, IA #Jobs #CareerArc | Job | +------------------+------+---------+ 5 rows selected (0.207 seconds)

以及總結(jié)標(biāo)簽計(jì)數(shù):

0: jdbc:drill:zk=local> with ent_hashtags as (select flatten(tweets.entities.hashtags) as hashtags from dfs.`/users/rmoff/data/geo_tweets.fixed.json` tweets) . . . . . . . . . . . > select ent_hashtags.hashtags.text,count(ent_hashtags.hashtags.text) from ent_hashtags . . . . . . . . . . . > group by ent_hashtags.hashtags.text . . . . . . . . . . . > order by 2 desc; +-----------------------------+---------+ | EXPR$0 | EXPR$1 | +-----------------------------+---------+ | Trump | 365 | | trndnl | 176 | | job | 170 | | Hiring | 127 | | Clinton | 108 | | Yorkshire | 100 | | CareerArc | 100 | [...]

要過濾掉可能沒有數(shù)組值的記錄(例如,不是每個(gè)推特都具有的哈希標(biāo)簽)并且沒有查詢的記錄可能會失敗,請對數(shù)組的第一個(gè)索引的屬性使用IS NOT NULL :

0: jdbc:drill:zk=local> select tweets.entities.hashtags from dfs.`/users/rmoff/data/geo_tweets.fixed.json` tweets where tweets.entities.hashtags[0].text is not null limit 5; +--------+ | EXPR$0 | +--------+ | [{"text":"hiring","indices":[6,13]},{"text":"Job","indices":[98,102]},{"text":"SkilledTrade","indices":[103,116]},{"text":"Tucson","indices":[117,124]},{"text":"Jobs","indices":[129,134]}] | | [{"text":"lol","indices":[72,76]},{"text":"nowthatsfunny","indices":[77,91]}] | | [{"text":"WinstonSalem","indices":[0,13]},{"text":"ws","indices":[92,95]}] | | [{"text":"trndnl","indices":[89,96]}] | | [{"text":"trndnl","indices":[92,99]}] | +--------+ 5 rows selected (0.187 seconds)

如果您嘗試比較數(shù)組本身,則無法使用:

0: jdbc:drill:zk=local> select tweets.entities.hashtags from dfs.`/users/rmoff/data/geo_tweets.fixed.json` tweets where tweets.entities.hashtags is not null limit 5; Error: SYSTEM ERROR: SchemaChangeException: Failure while trying to materialize incoming schema. Errors: Error in expression at index -1. Error: Missing function implementation: [isnotnull(MAP-REPEATED)]. Full expression: --UNKNOWN EXPRESSION--.. Fragment 0:0 [Error Id: 99ac12aa-f6b4-4692-b815-8f483da682c4 on 192.168.56.1:31010] (state=,code=0)

上面的示例演示了如何使用數(shù)組索引,這是FLATTEN的替代選擇,如果您知道它們將存在,則可以訪問數(shù)組中的單個(gè)對象:

0: jdbc:drill:zk=local> select tweets.entities.hashtags[0].text as first_hashtag,text from dfs.`/users/rmoff/data/geo_tweets.fixed.json` tweets where tweets.entities.hashtags[0].text is not null limit 5; +---------------+------+ | first_hashtag | text | +---------------+------+ | hiring | We're #hiring! Click to apply: Bench Jeweler - SEC Oracle & Wetmore - https://t.co/Oe2SHaL0Hh #Job #SkilledTrade #Tucson, AZ #Jobs | | lol | Someone built a wall around Trump's star on the Hollywood Walk of Fame. #lol #nowthatsfunny @… https://t.co/qHWuJXnzbw | | WinstonSalem | #WinstonSalem Time and place announced for Donald Trump's visit to… https://t.co/6OVl7crshw #ws @winston_salem_ https://t.co/l5h220otj4 |

查詢CSV文件

JSON文件相對易于解釋,因?yàn)槠渲邪攵x的架構(gòu),包括列名。 另一方面,在可靠地推斷列名時(shí),CSV(通常是字符分隔文件)更像是“狂野的西部”。 如果愿意,可以配置Apache Drill忽略CSV文件的第一行(假定它是標(biāo)題),也可以將它們用作列名。 如果您不這樣做,則查詢?nèi)缦滤镜腃SV文件:

[oracle@bigdatalite ~]$ head nyc_parking_violations.csv Summons Number,Plate ID,Registration State,Plate Type,Issue Date,Violation Code,Vehicle Body Type,Vehicle Make,Issuing Agency,Street Code1,Street Code2,Street Code3,Vehicle Expiration Date,Violation Location,Violation Precinct,Issuer Precinct,Issuer Code,Issuer Command,Issuer Squad,Violation Time,Time First Observed,Violation County,Violation In Front Of Or Opposite,House Number,Street Name,Intersecting Street,Date First Observed,Law Section,Sub Division,Violation Legal Code,Days Parking In Effect ,From Hours In Effect,To Hours In Effect,Vehicle Color,Unregistered Vehicle?,Vehicle Year,Meter Number,Feet From Curb,Violation Post Code,Violation Description,No Standing or Stopping Violation,Hydrant Violation,Double Parking Violation 1360858775,PHW9801,OH,PAS,07/01/2015,20,SUBN,HONDA,P,61490,26160,26190,0,0044,44,44,929822,0044,0000,0653P,,BX,O,651,RIVER AVE,,0,408,D,,BBBBBBB,ALL,ALL,,0,0,-,0,,,,,

您將獲得兩個(gè)記錄,每個(gè)記錄為一列寬,它們是一個(gè)數(shù)組:

0: jdbc:drill:zk=local> select * from `/user/oracle/incoming/nyc_parking/nyc_parking_violations.csv` LIMIT 5; +---------+ | columns | +---------+ | ["Summons Number","Plate ID","Registration State","Plate Type","Issue Date","Violation Code","Vehicle Body Type","Vehicle Make","Issuing Agency","Street Code1","Street Code2","Street Code3","Vehicle Expiration Date","Violation Location","Violation Precinct","Issuer Precinct","Issuer Code","Issuer Command","Issuer Squad","Violation Time","Time First Observed","Violation County","Violation In Front Of Or Opposite","House Number","Street Name","Intersecting Street","Date First Observed","Law Section","Sub Division","Violation Legal Code","Days Parking In Effect ","From Hours In Effect","To Hours In Effect","Vehicle Color","Unregistered Vehicle?","Vehicle Year","Meter Number","Feet From Curb","Violation Post Code","Violation Description","No Standing or Stopping Violation","Hydrant Violation","Double Parking Violation"] | | ["1360858775","PHW9801","OH","PAS","07/01/2015","20","SUBN","HONDA","P","61490","26160","26190","0","0044","44","44","929822","0044","0000","0653P","","BX","O","651","RIVER AVE","","0","408","D","","BBBBBBB","ALL","ALL","","0","0","-","0","","","","",""] |

要訪問CSV文件中的實(shí)際列,您需要使用columns[x]語法來引用它們。 請注意,各columns區(qū)分大小寫,并且編號從零開始:

0: jdbc:drill:zk=local> select columns[1] as `PlateID`, columns[2] as `RegistrationState` from `/user/oracle/incoming/nyc_parking/nyc_parking_violations.csv` limit 5; +----------+--------------------+ | PlateID | RegistrationState | +----------+--------------------+ | AR877A | NJ | | 73268ME | NY | | 2050240 | IN | | 2250017 | IN | | AH524C | NJ | +----------+--------------------+ 5 rows selected (0.247 seconds)

為了使重復(fù)處理數(shù)據(jù)更加容易,您可以定義數(shù)據(jù)視圖:

0: jdbc:drill:zk=local> create view dfs.tmp.NYC_Parking_01 as select columns[1] as `PlateID`, columns[2] as `RegistrationState` from `/user/oracle/incoming/nyc_parking/nyc_parking_violations.csv`; +-------+-----------------------------------------------------------------+ | ok | summary | +-------+-----------------------------------------------------------------+ | true | View 'NYC_Parking_01' created successfully in 'dfs.tmp' schema | +-------+-----------------------------------------------------------------+ 1 row selected (0.304 seconds)

這使用的是dfs存儲插件及其內(nèi)部的tmp模式,它具有以下存儲配置–請注意, writeable為true

"tmp": {"location": "/tmp","writable": true,"defaultInputFormat": null }

(如果您使用了錯(cuò)誤的數(shù)據(jù)庫[存儲插件]或架構(gòu),您將獲得Schema [hdfs] is immutable. )

查詢新視圖

0: jdbc:drill:zk=local> select * from dfs.tmp.NYC_Parking_01 limit 5; +-----------+---------------------+ | PlateID | RegistrationState | +-----------+---------------------+ | Plate ID | Registration State | | PHW9801 | OH | | K8010F | TN | | GFG6211 | NY | | GHL1805 | NY | +-----------+---------------------+ 5 rows selected (0.191 seconds)

通過視圖,或直接針對CSV路徑,您還可以運(yùn)行聚合:

0: jdbc:drill:zk=local> select PlateID,count(*) from dfs.tmp.NYC_Parking_01 group by PlateID having count(*) > 1 limit 1; +----------+---------+ | PlateID | EXPR$1 | +----------+---------+ | 2050240 | 4 | +----------+---------+ 1 row selected (15.983 seconds)

盡管對于相同的結(jié)果,這不能重新運(yùn)行-可能是由于limit子句

0: jdbc:drill:zk=local> select PlateID,count(*) from dfs.tmp.NYC_Parking_01 group by PlateID having count(*) > 1 limit 1; +----------+---------+ | PlateID | EXPR$1 | +----------+---------+ | AR877A | 3 | +----------+---------+ 1 row selected (12.881 seconds)

在視圖下,視圖定義被寫入/tmp –如果要在重新啟動后保留此數(shù)據(jù),則需要移動此路徑:

[oracle@bigdatalite parking]$ cat /tmp/NYC_Parking_01.view.drill {"name" : "NYC_Parking_01","sql" : "SELECT `columns`[1] AS `PlateID`, `columns`[2] AS `RegistrationState`\nFROM `/user/oracle/incoming/nyc_parking/nyc_parking_violations.csv`","fields" : [ {"name" : "PlateID","type" : "ANY","isNullable" : true}, {"name" : "RegistrationState","type" : "ANY","isNullable" : true} ],"workspaceSchemaPath" : [ "hdfs" ]

您也可以使用CTAS(選擇時(shí)創(chuàng)建表)創(chuàng)建實(shí)際表:

0: jdbc:drill:zk=local> create table dfs.tmp.parking as select columns[1] as `PlateID`, columns[2] as `RegistrationState` from `/user/oracle/incoming/nyc_parking/nyc_parking_violations.csv`; +-----------+----------------------------+ | Fragment | Number of records written | +-----------+----------------------------+ | 1_1 | 4471875 | | 1_0 | 4788421 | +-----------+----------------------------+ 2 rows selected (42.913 seconds)

它存儲在磁盤上(按dfs配置),默認(rèn)情況下以Parquet格式存儲:

[oracle@bigdatalite parking]$ ls -l /tmp/parking/ total 76508 -rw-r--r--. 1 oracle oinstall 40623288 Aug 10 22:53 1_0_0.parquet -rw-r--r--. 1 oracle oinstall 37717804 Aug 10 22:53 1_1_0.parquet

Drill的Web界面

Drill帶有Web界面,您可以從http://訪問

:8047 /對

  • 發(fā)出查詢

  • 配置其他存儲插件(例如, 數(shù)據(jù)庫 , hdfs等)
  • 指標(biāo)和調(diào)試

定義存儲插件

在Drill Web界面中,您可以查看現(xiàn)有的存儲插件或定義新的存儲插件。 要創(chuàng)建一個(gè)新文件,請?jiān)凇按鎯Α表撁嫔系摹?新存儲插件”下輸入其名稱(例如hdfs ,但可能會引起fred -只是一個(gè)標(biāo)簽),然后單擊“創(chuàng)建”。 在“配置”框中粘貼必要的JSON定義,然后單擊“創(chuàng)建”。 如果您不想使用GUI,那么還有REST API。

存儲插件配置存儲在Zookeeper中(運(yùn)行分布式Drill時(shí)),或者獨(dú)立運(yùn)行時(shí)在sys.store.provider.local.path路徑中本地sys.store.provider.local.path 。 默認(rèn)情況下,該/tmp位于/tmp下,該/tmp在服務(wù)器重新啟動時(shí)被清除。 要保留自定義存儲配置,請修改drill-override.conf的sys.store.provider.local.path ,例如:

drill.exec: {cluster-id: "drillbits1",zk.connect: "localhost:2181"sys.store.provider.local.path="/home/oracle/drill/" }

處理文件系統(tǒng)數(shù)據(jù)

這是一個(gè)使Drill能夠訪問CDH群集的HDFS的存儲配置示例:

{"type": "file","enabled": true,"connection": "hdfs://cdh57-01-node-01:8020/","config": null,"workspaces": {"root": {"location": "/","writable": true,"defaultInputFormat": null}},"formats": {"csv": {"type": "text","extensions": ["csv"],"delimiter": ","},"json": {"type": "json","extensions": ["json"]}} }

除了HDFS的connection參數(shù)本身外,此配置中的重要部分是formats部分。 這就告訴Drill如何處理找到的文件,而最終用戶不必顯式聲明其類型。

對于基于文件系統(tǒng)的插件dfs (可以包括本地文件,HDFS甚至Amazon S3),您可以瀏覽可用的“表”:

列出HDFS中的文件(以前use hdfs;選擇)

0: jdbc:drill:zk=local> show files; +--------+--------------+---------+---------+--------+-------------+--------------+------------------------+--------------------------+ | name | isDirectory | isFile | length | owner | group | permissions | accessTime | modificationTime | +--------+--------------+---------+---------+--------+-------------+--------------+------------------------+--------------------------+ | hbase | true | false | 0 | hbase | supergroup | rwxr-xr-x | 1969-12-31 19:00:00.0 | 2016-07-25 14:46:08.212 | | share | true | false | 0 | hdfs | supergroup | rwxrwxrwx | 1969-12-31 19:00:00.0 | 2016-05-15 12:28:08.152 | | solr | true | false | 0 | solr | solr | rwxr-xr-x | 1969-12-31 19:00:00.0 | 2016-06-01 18:34:50.716 | | tmp | true | false | 0 | hdfs | supergroup | rwxrwxrwt | 1969-12-31 19:00:00.0 | 2016-06-24 04:54:41.491 | | user | true | false | 0 | hdfs | supergroup | rwxrwxrwx | 1969-12-31 19:00:00.0 | 2016-06-21 15:55:59.084 | | var | true | false | 0 | hdfs | supergroup | rwxr-xr-x | 1969-12-31 19:00:00.0 | 2016-05-11 17:53:29.804 | +--------+--------------+---------+---------+--------+-------------+--------------+------------------------+--------------------------+ 6 rows selected (0.145 seconds)

顯示給定路徑中的文件:

0: jdbc:drill:zk=local> show files in `/user/oracle`; +----------------+--------------+---------+---------+---------+---------+--------------+------------------------+--------------------------+ | name | isDirectory | isFile | length | owner | group | permissions | accessTime | modificationTime | +----------------+--------------+---------+---------+---------+---------+--------------+------------------------+--------------------------+ | .Trash | true | false | 0 | oracle | oracle | rwxr-xr-x | 1969-12-31 19:00:00.0 | 2016-05-23 20:42:34.815 | | .sparkStaging | true | false | 0 | oracle | oracle | rwxr-xr-x | 1969-12-31 19:00:00.0 | 2016-07-06 03:56:38.863 | | .staging | true | false | 0 | oracle | oracle | rwx------ | 1969-12-31 19:00:00.0 | 2016-06-01 18:37:04.005 | | incoming | true | false | 0 | oracle | oracle | rwxr-xr-x | 1969-12-31 19:00:00.0 | 2016-08-03 05:34:12.38 | | mediademo | true | false | 0 | oracle | oracle | rwxr-xr-x | 1969-12-31 19:00:00.0 | 2016-06-01 18:59:45.653 | | moviedemo | true | false | 0 | oracle | oracle | rwxr-xr-x | 1969-12-31 19:00:00.0 | 2016-05-15 12:02:55.652 | | moviework | true | false | 0 | oracle | oracle | rwxr-xr-x | 1969-12-31 19:00:00.0 | 2016-05-15 12:03:01.497 | | oggdemo | true | false | 0 | oracle | oracle | rwxr-xr-x | 1969-12-31 19:00:00.0 | 2016-05-15 12:03:01.552 | | oozie-oozi | true | false | 0 | oracle | oracle | rwxr-xr-x | 1969-12-31 19:00:00.0 | 2016-05-15 12:03:01.651 | +----------------+--------------+---------+---------+---------+---------+--------------+------------------------+--------------------------+ 9 rows selected (0.428 seconds)

您還可以通過指定通配符匹配來查詢多個(gè)文件。 以下是可用文件的截?cái)嗔斜?#xff1a;

0: jdbc:drill:zk=cdh57-01-node-01.moffatt.me:> show files in `hdfs`.`/user/rmoff/incoming/twitter/2016/06/17/tweets/`; +--------------------------+--------------+---------+----------+--------+--------+--------------+--------------------------+--------------------------+ | name | isDirectory | isFile | length | owner | group | permissions | accessTime | modificationTime | +--------------------------+--------------+---------+----------+--------+--------+--------------+--------------------------+--------------------------+ | FlumeData.1466176113171 | false | true | 1055675 | rmoff | rmoff | rw-r--r-- | 2016-08-10 21:28:27.072 | 2016-06-17 16:08:38.023 | | FlumeData.1466176113172 | false | true | 1051411 | rmoff | rmoff | rw-r--r-- | 2016-08-05 20:46:51.756 | 2016-06-17 16:08:40.597 | | FlumeData.1466176113173 | false | true | 1054734 | rmoff | rmoff | rw-r--r-- | 2016-08-05 20:46:51.752 | 2016-06-17 16:08:43.33 | | FlumeData.1466176113174 | false | true | 1050991 | rmoff | rmoff | rw-r--r-- | 2016-08-05 20:46:51.743 | 2016-06-17 16:08:44.361 | | FlumeData.1466176113175 | false | true | 1053577 | rmoff | rmoff | rw-r--r-- | 2016-08-05 20:46:51.748 | 2016-06-17 16:08:45.162 | | FlumeData.1466176113176 | false | true | 1051965 | rmoff | rmoff | rw-r--r-- | 2016-08-05 20:46:51.752 | 2016-06-17 16:08:46.261 | | FlumeData.1466176113177 | false | true | 1049555 | rmoff | rmoff | rw-r--r-- | 2016-08-05 20:46:51.758 | 2016-06-17 16:08:47.425 | | FlumeData.1466176113178 | false | true | 1050566 | rmoff | rmoff | rw-r--r-- | 2016-08-05 20:46:51.758 | 2016-06-17 16:08:48.23 | | FlumeData.1466176113179 | false | true | 1051751 | rmoff | rmoff | rw-r--r-- | 2016-08-05 20:46:51.756 | 2016-06-17 16:08:49.381 | | FlumeData.1466176113180 | false | true | 1052249 | rmoff | rmoff | rw-r--r-- | 2016-08-05 20:46:51.757 | 2016-06-17 16:08:50.042 | | FlumeData.1466176113181 | false | true | 1055002 | rmoff | rmoff | rw-r--r-- | 2016-08-05 20:46:51.758 | 2016-06-17 16:08:50.896 | | FlumeData.1466176113182 | false | true | 1050812 | rmoff | rmoff | rw-r--r-- | 2016-08-05 20:46:51.758 | 2016-06-17 16:08:52.191 | | FlumeData.1466176113183 | false | true | 1048954 | rmoff | rmoff | rw-r--r-- | 2016-08-05 20:46:51.757 | 2016-06-17 16:08:52.994 | | FlumeData.1466176113184 | false | true | 1051559 | rmoff | rmoff | rw-r--r-- | 2016-08-05 20:46:51.773 | 2016-06-17 16:08:54.025 | [...]

計(jì)算一個(gè)文件( FlumeData.1466176113171 )中的記錄數(shù):

0: jdbc:drill:zk=cdh57-01-node-01.moffatt.me:> SELECT count(*) FROM table(`hdfs`.`/user/rmoff/incoming/twitter/2016/06/17/tweets/FlumeData.1466176113171`(type => 'json')); +---------+ | EXPR$0 | +---------+ | 277 | +---------+ 1 row selected (0.798 seconds)

在幾個(gè)文件中( FlumeData.146617611317* ):

0: jdbc:drill:zk=cdh57-01-node-01.moffatt.me:> SELECT count(*) FROM table(`hdfs`.`/user/rmoff/incoming/twitter/2016/06/17/tweets/FlumeData.146617611317*`(type => 'json')); +---------+ | EXPR$0 | +---------+ | 2415 | +---------+ 1 row selected (2.466 seconds)

在文件夾( * )中的所有文件中:

0: jdbc:drill:zk=cdh57-01-node-01.moffatt.me:> SELECT count(*) FROM table(`hdfs`.`/user/rmoff/incoming/twitter/2016/06/17/tweets/*`(type => 'json')); +---------+ | EXPR$0 | +---------+ | 7414 | +---------+ 1 row selected (3.867 seconds)

甚至跨多個(gè)文件夾:

0: jdbc:drill:zk=cdh57-01-node-01.moffatt.me:> SELECT count(*) FROM table(`hdfs`.`/user/flume/incoming/twitter/2016/06/*/*`(type => 'json')); +---------+ | EXPR$0 | +---------+ | 206793 | +---------+ 1 row selected (87.545 seconds)

查詢不帶識別擴(kuò)展名的數(shù)據(jù)

Drill依賴于orer中存儲擴(kuò)展配置的format子句來確定如何根據(jù)文件的擴(kuò)展名解釋文件。 您將不會總是擁有可用的或已定義的擴(kuò)展。 如果嘗試查詢此類數(shù)據(jù),您將走不遠(yuǎn)。 在此示例中,我正在以JSON格式但不帶.json后綴的HDFS上查詢數(shù)據(jù):

0: jdbc:drill:zk=cdh57-01-node-01.moffatt.me:> SELECT text FROM `hdfs`.`/user/rmoff/incoming/twitter/2016/06/17/tweets/FlumeData.1466176113171` limit 5; Error: VALIDATION ERROR: From line 1, column 18 to line 1, column 23: Table 'hdfs./user/rmoff/incoming/twitter/2016/06/17/tweets/FlumeData.1466176113171' not foundSQL Query null

不要擔(dān)心–您可以將它們聲明為查詢語法的一部分。

0: jdbc:drill:zk=cdh57-01-node-01.moffatt.me:> SELECT text FROM table(`hdfs`.`/user/rmoff/incoming/twitter/2016/06/17/tweets/FlumeData.1466176113171`(type => 'json')) limit 5; +------+ | text | +------+ | RT @jjkukrl: susu bayi jg lagi mahal nih ugh ayah harus semangat cari duit ^^9 https://t.co/2NvTOShRbI | | Oracle Java 1Z0-808 Web Exam Simulator https://t.co/tZ3gU8EMj3 | | @TribuneSelatan ahaha kudu gaya atuh da arek lebarann ahahaha | | Short impression of yesterday's speech. What a great day it was! #lifeatoracle #team #salesincentive #oracle https://t.co/SVK2ovOe3U | | Want to work at Oracle? We're #hiring in New York! Click for details: https://t.co/NMTo1WMHVw #Sales #Job #Jobs #CareerArc | +------+ 5 rows selected (1.267 seconds)

存儲配置– Oracle

根據(jù)文檔,可以很容易地查詢RDBMS(例如Oracle)中的數(shù)據(jù)。 只需將JDBC驅(qū)動程序復(fù)制到Apache Drill的jar文件夾中:

cp /u01/app/oracle/product/12.1.0.2/dbhome_1/jdbc/lib/ojdbc7.jar /opt/apache-drill-1.7.0/jars/3rdparty/

然后添加必要的存儲配置,我稱之為ora:

{"type": "jdbc","driver": "oracle.jdbc.OracleDriver","url": "jdbc:oracle:thin:moviedemo/welcome1@localhost:1521/ORCL","username": null,"password": null,"enabled": true }

如果遇到錯(cuò)誤, Please retry: error (unable to create/ update storage)然后檢查目標(biāo)Oracle數(shù)據(jù)庫是否已啟動,密碼是否正確,等等。

然后,您可以在Hive中查詢數(shù)據(jù):

0: jdbc:drill:zk=local> use ora.MOVIEDEMO; +-------+--------------------------------------------+ | ok | summary | +-------+--------------------------------------------+ | true | Default schema changed to [ora.MOVIEDEMO] | +-------+--------------------------------------------+ 1 row selected (0.205 seconds)0: jdbc:drill:zk=local> show tables; +----------------+-----------------------------+ | TABLE_SCHEMA | TABLE_NAME | +----------------+-----------------------------+ | ora.MOVIEDEMO | ACTIVITY | | ora.MOVIEDEMO | BDS_CUSTOMER_RFM | | ora.MOVIEDEMO | BUSINESS_REVIEW_SUMMARY | [...]0: jdbc:drill:zk=local> select * from ACTIVITY limit 5; +--------------+---------+ | ACTIVITY_ID | NAME | +--------------+---------+ | 3.0 | Pause | | 6.0 | List | | 7.0 | Search | | 8.0 | Login | | 9.0 | Logout | +--------------+---------+ 5 rows selected (1.644 seconds)

如果出現(xiàn)錯(cuò)誤:DATA_READ錯(cuò)誤:嘗試設(shè)置SQL查詢時(shí)JDBC存儲插件失敗。 然后在Apache Drill中啟用詳細(xì)錯(cuò)誤,以查看問題所在:

0: jdbc:drill:zk=local> ALTER SESSION SET `exec.errors.verbose` = true; +-------+-------------------------------+ | ok | summary | +-------+-------------------------------+ | true | exec.errors.verbose updated. | +-------+-------------------------------+ 1 row selected (0.154 seconds)0: jdbc:drill:zk=local> select * from ora.MOVIEDEMO.YELP_BUSINESS limit 1; Error: DATA_READ ERROR: The JDBC storage plugin failed while trying setup the SQL query.sql SELECT * FROM "MOVIEDEMO"."YELP_BUSINESS" plugin ora Fragment 0:0[Error Id: 40343dd5-1354-48ed-90ef-77ae1390411b on bigdatalite.localdomain:31010](java.sql.SQLException) ORA-29913: error in executing ODCIEXTTABLEOPEN callout ORA-29400: data cartridge error KUP-11504: error from external driver: MetaException(message:Could not connect to meta store using any of the URIs provided. Most recent failure: org.apache.thrift.transport.TTransportException: java.net.ConnectException: Connection refused

這是Oracle正在查詢的外部表的問題( ORA-29913: error in executing ODCIEXTTABLEOPEN )。 它實(shí)際上是一個(gè)Hive表之上的Oracle外部表,顯然Drill可以直接查詢-但是,我們只是在這里進(jìn)行沙箱測試…

查詢執(zhí)行

就像Oracle有其基于成本的優(yōu)化程序(CBO)來幫助它確定如何執(zhí)行查詢以及最有效地執(zhí)行該查詢一樣,Apache Drill的執(zhí)行引擎也可以確定如何實(shí)際執(zhí)行您提供給它的查詢。 這還包括如何將其拆分為多個(gè)節(jié)點(diǎn)(“鉆頭”)(如果可用),以及在某些情況下進(jìn)行優(yōu)化(例如分區(qū)修剪) 。 您可以在此處詳細(xì)了解查詢執(zhí)行的工作原理 ,并在此處觀看有關(guān)它的詳細(xì)說明 。 要查看查詢的解釋計(jì)劃,請使用explain plan :

0: jdbc:drill:zk=local> !set maxwidth 10000 0: jdbc:drill:zk=local> explain plan for select `date`,count(*) as tip_count from `/user/oracle/incoming/yelp/tip_json/yelp_academic_dataset_tip.json` group by `date` order by 2 desc limit 5; +------+------+ | text | json | +------+------+ | 00-00 Screen 00-01 Project(date=[$0], tip_count=[$1]) 00-02 SelectionVectorRemover 00-03 Limit(fetch=[5]) 00-04 SelectionVectorRemover 00-05 TopN(limit=[5]) 00-06 HashAgg(group=[{0}], tip_count=[$SUM0($1)]) 00-07 HashAgg(group=[{0}], tip_count=[COUNT()]) 00-08 Scan(groupscan=[EasyGroupScan [selectionRoot=hdfs://localhost:8020/user/oracle/incoming/yelp/tip_json/yelp_academic_dataset_tip.json, numFiles=1, columns=[`date`], files=[hdfs://localhost:8020/user/oracle/incoming/yelp/tip_json/yelp_academic_dataset_tip.json]]]) | {"head" : {"version" : 1,"generator" : {"type" : "ExplainHandler","info" : ""[...]

您還可以使用Drill Web界面查看有關(guān)查詢執(zhí)行方式的信息:

鉆探器

MapR Drill ODBC驅(qū)動程序附帶一個(gè)名為Drill Explorer的工具。 這是一個(gè)GUI,使您可以通過導(dǎo)航數(shù)據(jù)庫(==存儲插件)和其中的文件夾/文件,預(yù)覽數(shù)據(jù)甚至創(chuàng)建視圖來瀏覽數(shù)據(jù)。

鉆探客戶

在Drill客戶端中,有多種可用設(shè)置:

0: jdbc:drill:zk=local> !set autocommit true autosave false color true fastconnect true force false headerinterval 100 historyfile /home/oracle/.sqlline/history incremental true isolation TRANSACTION_REPEATABLE_READ maxcolumnwidth 15 maxheight 56 maxwidth 1000000 numberformat default outputformat table propertiesfile /home/oracle/.sqlline/sqlline.properties rowlimit 0 showelapsedtime true showheader true shownestederrs false showwarnings true silent false timeout -1 trimscripts true verbose false

要更改一個(gè),例如顯示的輸出寬度:

0: jdbc:drill:zk=local> !set maxwidth 10000

要連接到遠(yuǎn)程Drill,請指定存儲Drillbit連接信息的Zookeeper節(jié)點(diǎn):

rmoff@asgard-3:apache-drill-1.7.0> bin/sqlline -u jdbc:drill:zk=cdh57-01-node-01.moffatt.me:2181,cdh57-01-node-02.moffatt.me:2181,cdh57-01-node-03.moffatt.me:2181

結(jié)論

Apache Drill是一個(gè)功能強(qiáng)大的工具,用于針對不同的數(shù)據(jù)源使用熟悉的查詢語言(SQL)。 在小范圍內(nèi),僅能夠通過JSON之類的結(jié)構(gòu)化文件進(jìn)行切片和切塊是一個(gè)巨大的勝利。 在更大范圍內(nèi),嘗試在一組計(jì)算機(jī)集群中查詢更大數(shù)量的數(shù)據(jù)時(shí)與Apache Drill進(jìn)行比較是很有意思的,也許可以與諸如Impala之類的工具進(jìn)行比較。

有關(guān)Apache Drill的更多信息,請參見如何從OBIEE中訪問Drill。

翻譯自: https://www.javacodegeeks.com/2016/09/guide-getting-started-apache-drill.html

總結(jié)

以上是生活随笔為你收集整理的如何指南:Apache Drill入门的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

香蕉一区| 成人黄大片视频在线观看 | 成人久久18免费网站 | 亚洲3级 | 久久精品久久精品久久 | 69精品| av中文资源在线 | 国产精品成人国产乱一区 | 久久草av| 日韩欧美在线观看一区二区 | 在线精品视频免费播放 | 色婷婷中文 | 丁香花在线视频观看免费 | 99久久激情 | 久久99久久久久久 | 97精品在线| 国产中文a | 免费h精品视频在线播放 | 粉嫩av一区二区三区免费 | 国产99爱| 少妇激情久久 | 亚洲3级| 久久国产高清视频 | 欧美久久久久久久久 | 一区二区三区高清在线 | 91福利视频网站 | 国产精品网在线观看 | 国产成人中文字幕 | 欧美在线观看视频一区二区三区 | 成人高清在线 | 亚洲精品久久久久中文字幕m男 | 婷婷久久国产 | 色网站在线看 | 午夜性福利 | 亚洲国产精品久久久久 | 中文字幕乱码电影 | 99久久精品免费看国产一区二区三区 | 国内外成人免费在线视频 | 日韩视频在线观看视频 | 久久成人一区二区 | 韩国av电影网 | 色婷婷啪啪免费在线电影观看 | 美女黄网站视频免费 | 亚洲一区二区视频 | 在线观看完整版免费 | 丝袜制服天堂 | 四虎在线永久免费观看 | av免费在线观看网站 | 韩日av在线 | 日韩av专区 | 欧美一二三区在线观看 | 日韩高清三区 | 麻豆国产精品一区二区三区 | 久草视频在线资源 | 日韩午夜在线播放 | 日韩高清一| 国产精品自在线 | 亚洲高清视频在线观看免费 | 成人黄色大片在线免费观看 | 久久艹综合| 91九色国产在线 | 免费日韩电影 | 天天干夜夜爱 | 九色porny真实丨国产18 | 国产手机在线播放 | 天天操夜夜操国产精品 | 麻豆久久精品 | 国产精品日韩在线观看 | 99re中文字幕| 国产亚洲精品福利 | 中文在线字幕观看电影 | 激情影音 | 人人干人人爽 | 丰满少妇高潮在线观看 | 日韩一区二区三区免费电影 | 久久精品波多野结衣 | 福利视频一二区 | 美女网站在线观看 | 久久久首页 | 久久躁日日躁aaaaxxxx | 免费福利片 | av在线等 | 97色资源| 久久久久久高清 | 永久免费的啪啪网站免费观看浪潮 | 欧美久草在线 | 久久天堂影院 | 91女子私密保健养生少妇 | 五月综合久久 | 91热视频 | 免费视频国产 | 久久久久99精品成人片三人毛片 | 国产精品一区二区在线 | 人人狠狠综合久久亚洲婷 | 亚洲美女在线一区 | 色噜噜在线观看视频 | 91久久奴性调教 | 天堂网一区二区三区 | 国产成人精品亚洲精品 | 91在线免费播放 | 天天干天天做 | 国产看片 色 | 国产免费二区 | 久久久电影网站 | 久免费 | 久久99久久99免费视频 | 亚洲精品日韩一区二区电影 | 99久久综合精品五月天 | 在线观看免费成人av | 91网址在线观看 | 久久综合久久综合这里只有精品 | 美女视频国产 | 97在线免费视频观看 | 成人九九视频 | 在线观看视频99 | 99爱精品视频 | av片一区| 高清不卡一区二区在线 | 国产精品久久99精品毛片三a | 国产亚洲精品久 | 国产精品成人国产乱一区 | 中文在线www| 91九色蝌蚪视频在线 | 久久久久夜色 | 欧美一级久久久 | 国产精品第7页 | 中文字幕在线中文 | 在线观看视频你懂的 | 免费看国产曰批40分钟 | 午夜精品一区二区三区在线 | 玖玖视频网 | 天天天天天天操 | 东方av在线免费观看 | 久久久国产影院 | 91亚洲综合 | 九九国产精品视频 | 懂色av一区二区在线播放 | 91免费观看网站 | 日韩成人在线一区二区 | 亚洲片在线 | 亚洲欧美激情精品一区二区 | 国产视频日本 | 久久成人视屏 | 麻豆系列在线观看 | 黄色av网站在线免费观看 | 成人香蕉视频 | 99久久久久久久 | 免费aa大片| 中文字幕一区二区三区久久 | 久久这里有精品 | 在线精品视频免费观看 | 玖玖在线看 | av电影不卡在线 | 日本99干网 | 国产精品久久久久久久久久三级 | 久久a久久| 一区二区丝袜 | 成人在线观看你懂的 | 国产精品福利小视频 | 久久久久免费精品视频 | 成人a级网站 | 欧美性极品xxxx娇小 | 国产高清在线a视频大全 | 日韩av中文在线 | 免费在线黄色av | 国产婷婷vvvv激情久 | 五月婷婷播播 | 国产一级精品在线观看 | 国产精品美乳一区二区免费 | 日韩偷拍精品 | 久久久久国产成人精品亚洲午夜 | 国产成人一区二区三区 | 久久人人爽视频 | 久草在线视频在线观看 | 日韩在线观看网址 | 91精品欧美 | 国产精品美女毛片真酒店 | 欧美色综合天天久久综合精品 | 久草精品视频在线播放 | 久久久高清视频 | 嫩草伊人久久精品少妇av | 欧美日韩三级在线观看 | 全黄色一级片 | 欧美视频18 | 天天干夜夜爱 | 亚洲精品国产品国语在线 | 久久试看 | 日本久久免费视频 | 91视频下载| 中文字幕一区二区在线播放 | 玖玖在线播放 | 亚洲精品无 | 精品中文字幕视频 | 久久久影视 | 国产香蕉视频在线播放 | 91视频 - 88av | 五月婷婷开心 | 成年人在线观看网站 | 中文字幕精品一区二区精品 | 欧美一级性 | 美女免费视频一区二区 | 久久免费在线视频 | 人人干在线观看 | 人人射人人爱 | 久久国语露脸国产精品电影 | 天天天干| 天天射天天干天天操 | 久久免费在线观看 | 国产精品久久久久久999 | av中文字幕在线播放 | 亚洲视频免费在线观看 | 欧美在线a视频 | 国产群p | 国产综合在线视频 | www.天天射.com | 久草网在线视频 | 日韩视 | 人人狠狠综合久久亚洲婷 | 国产高清视频在线观看 | 91福利在线观看 | 中文字幕有码在线播放 | 黄色的网站免费看 | www.午夜| 99热官网 | 免费欧美高清视频 | 亚洲色图美腿丝袜 | 中文在线www | 999视频在线播放 | 国产亚洲精品久久久久动 | 免费在线播放黄色 | 在线看免费 | 久久国产一区二区 | 国产一级二级av | 亚洲激情小视频 | 私人av| 狠狠操91 | 黄色片视频在线观看 | 深爱五月激情五月 | 国产麻豆精品久久一二三 | 天天操天 | 人人揉人人揉人人揉人人揉97 | 999电影免费在线观看2020 | 欧美激情精品久久久久久变态 | 久久久免费高清视频 | 丁香花在线观看免费完整版视频 | 天天爽天天摸 | 玖玖国产精品视频 | 成人看片 | 日韩电影一区二区三区在线观看 | 91精品视频一区 | 亚洲一级片在线观看 | 91亚瑟视频 | 激情在线网站 | 日本大尺码专区mv | 日韩一区精品 | 久久艹国产视频 | 国产午夜精品一区二区三区 | 国产高清在线免费视频 | 中文亚洲欧美日韩 | 久久久婷 | www.com久久 | 日韩成人看片 | 五月婷综合 | 婷婷丁香在线视频 | 人人狠狠综合久久亚洲 | 九七视频在线观看 | 日本精品在线 | 黄色一级大片免费看 | 成片视频在线观看 | 欧美日韩xxxxx | 狠狠狠狠狠狠狠干 | 国产精品理论片 | 日韩二区三区在线 | 日本黄色大片免费 | 99热在线这里只有精品 | 国产精华国产精品 | 婷婷国产在线 | 国内精品小视频 | 日韩精品视频免费在线观看 | 久久久久婷 | 美女网站在线免费观看 | 久久久久久久国产精品视频 | 天天干视频在线 | 中文字幕一区在线观看视频 | 五月综合激情婷婷 | 97色资源 | 永久免费毛片在线观看 | 99久久综合狠狠综合久久 | 日韩免费一二三区 | 久久精品人人做人人综合老师 | 欧美国产三区 | 日韩国产精品一区 | 国产999精品久久久久久 | www免费网站在线观看 | 免费看的国产视频网站 | 最近能播放的中文字幕 | 91高清在线看| 久久99精品久久久久久久久久久久 | 亚洲一区视频在线播放 | 国产人成看黄久久久久久久久 | 亚洲最新合集 | 国产精品久久在线观看 | 97狠狠操| 国产精品视频内 | av在线免费在线观看 | 日本天天色 | 婷婷在线观看视频 | 国产探花视频在线播放 | 亚洲狠狠操 | 精品久久久久久久久久久久久久久久久久 | 五月婷婷视频在线 | 久久亚洲精品电影 | 亚洲aⅴ一区二区三区 | 色婷婷综合久久久久 | 狠狠操影视 | 午夜精品一区二区三区在线播放 | 色狠狠操 | 99久久久国产精品美女 | 在线免费av电影 | 精品一区二区三区电影 | 在线播放一区 | 亚洲免费精品视频 | 日韩网页 | 国产午夜麻豆影院在线观看 | 亚洲精品66 | 人人射人人插 | 日韩欧美精品在线视频 | 永久免费观看视频 | 久久久久久久久久久高潮一区二区 | 97精品国产97久久久久久免费 | 精品欧美一区二区在线观看 | 久久久久久久久久福利 | 亚洲专区在线视频 | 丁香九月婷婷综合 | 麻豆国产视频 | 国产三级香港三韩国三级 | 天天超碰 | 天天射天天干天天 | 国产无遮挡又黄又爽馒头漫画 | 久久久久久国产精品免费 | 在线成人一区 | 97看片吧 | 中文在线最新版天堂 | 特黄一级毛片 | 久草影视在线观看 | 九九视频免费在线观看 | 国产va在线| 精品一区二区三区久久久 | 亚洲午夜精品久久久久久久久久久久 | 2018亚洲男人天堂 | 欧美一级黄色视屏 | 免费在线观看一级片 | 天天操天天操天天操天天操天天操 | 久久久久久高潮国产精品视 | av中文字幕在线免费观看 | 免费观看91视频大全 | 欧美另类激情 | 国产一区二区精品久久91 | 在线视频1卡二卡三卡 | 99爱在线观看 | 中文字幕在线日亚洲9 | www黄色软件 | 欧美视频99 | 九九免费在线看完整版 | 一区免费观看 | 欧美日韩精品影院 | 日本 在线 视频 中文 有码 | 中文字幕色在线视频 | 欧美伦理一区二区三区 | 天天干夜夜干 | 91在线视频观看免费 | 99视频在线观看一区三区 | 日日干视频| 91亚洲视频在线观看 | 欧美 激情 国产 91 在线 | 深夜免费福利网站 | 有没有在线观看av | 天天爱天天干天天爽 | 日本久久久久久久久久 | 亚洲天天在线 | 天天综合导航 | 久久久国产精品免费 | 国产视频一区二区在线 | 99在线观看视频网站 | 亚洲久草网 | 91在线观| 69国产精品成人在线播放 | 狠狠干狠狠插 | 免费一级片视频 | 黄色免费观看网址 | 久久久久免费观看 | 狠狠色噜噜狠狠狠狠2022 | 国产精品va在线观看入 | 国产精品自在欧美一区 | 岛国av在线不卡 | 日韩高清精品免费观看 | 视频一区二区在线 | 在线激情av电影 | 精品亚洲一区二区 | 亚洲激情一区二区三区 | 蜜桃视频日本 | 久一网站| 亚洲国内在线 | 一级黄色电影网站 | 国产精品99久久久久人中文网介绍 | 日韩av高清在线观看 | 深爱激情站 | 亚洲最新视频在线播放 | 亚洲久草在线 | 久久99国产精品久久99 | 国产成人777777 | 超碰在线最新 | 日韩精品免费专区 | 日日摸日日添夜夜爽97 | 麻豆视频观看 | 久久99热这里只有精品 | 久久都是精品 | 国产黄色成人av | 午夜视频导航 | 在线观看蜜桃视频 | 人人爱人人做人人爽 | 免费在线观看午夜视频 | 爱爱一区 | 欧美污网站| 日韩有码在线观看视频 | 91av九色| www天天干com | 中文字幕丝袜一区二区 | 99热亚洲精品 | 狠狠干电影 | 91自拍91 | 深爱婷婷网| 久久99热国产 | 欧美91片 | www.五月天色| 国产在线观看99 | 国产综合在线视频 | 欧美激情视频免费看 | 久久精品国产精品亚洲精品 | 久久99国产精品二区护士 | 亚洲区二区 | 三级av免费看 | 中文字幕一区二区三区在线视频 | 亚洲综合成人婷婷小说 | 国产精品欧美久久久久三级 | 国产一二区免费视频 | 国内丰满少妇猛烈精品播放 | 在线视频 你懂得 | 中文字幕制服丝袜av久久 | 国产一级在线观看视频 | 欧美一级片在线免费观看 | 中文字幕亚洲不卡 | 黄色一级性片 | 日韩中文字幕免费电影 | 夜夜躁日日躁狠狠久久av | 久久男人免费视频 | 欧美日一级片 | 91香蕉亚洲精品 | 国产色在线 | 亚洲精品久久久蜜桃直播 | 四虎国产精 | 久久免费看 | 国产精品12 | 国产福利一区在线观看 | 中文字幕第 | 美女福利视频在线 | 亚洲男男gaygayxxxgv | 国产精品一区二区久久 | 久久永久免费 | 国产成人性色生活片 | 国产成人精品三级 | 国产精品成人一区二区三区吃奶 | 日韩影视精品 | 久久久久久久久久久久电影 | 久草视频在线免费 | 五月天久久综合网 | 91私密视频 | 亚洲色影爱久久精品 | 91成人久久 | 亚洲资源一区 | 成人v| 国产1区在线 | 香蕉视频国产在线观看 | 看v片| 中国一级片视频 | 国产精品福利在线播放 | 国产尤物视频在线 | 亚洲天天做 | 99精品视频精品精品视频 | 欧美日高清视频 | 最新影院 | 久久高清| www日日| 久久首页| 2019中文最近的2019中文在线 | 国产成人精品一区二区三区网站观看 | 三级动态视频在线观看 | 激情综合站 | 国产v亚洲v | 久久激情视频网 | 国产午夜激情视频 | 久久久免费少妇 | 9在线观看免费高清完整版在线观看明 | 免费日韩在线 | 亚洲九九| 精品一区二区在线看 | 免费观看成人网 | 国内精品一区二区 | 国产精品福利一区 | 国产精品美乳一区二区免费 | 午夜精品久久久99热福利 | 狠狠操狠狠干天天操 | 丁香色综合 | 日韩av电影免费观看 | 麻豆视频免费版 | 久久涩视频 | 国产视频精品免费 | 97超碰在线免费 | 2022国产精品视频 | 国产99久久久精品 | 亚洲永久精品在线观看 | 国产精品人成电影在线观看 | 久久国产精品99久久久久久丝袜 | 一区二区三区四区久久 | 五月婷丁香网 | 91av在线视频播放 | 欧美视频在线二区 | 久久九九影视网 | 精品一区二区精品 | av观看在线观看 | 久久午夜色播影院免费高清 | 久久夜色精品国产欧美乱极品 | 最近中文字幕高清字幕在线视频 | 日韩一区二区三免费高清在线观看 | 成人国产精品免费观看 | 在线免费观看黄网站 | 中文字幕最新精品 | 久久天天躁狠狠躁夜夜不卡公司 | 日本在线观看一区二区三区 | 91麻豆免费看| 黄色在线免费观看网址 | www视频在线播放 | 成人一级电影在线观看 | 久久婷婷精品视频 | 日韩一区二区三区在线观看 | 国产一区二区免费在线观看 | 高潮久久久久久久久 | 国产成人777777 | 在线观看久草 | 日日夜夜狠狠操 | 中文字幕在线字幕中文 | 久久婷亚洲五月一区天天躁 | 日韩乱码中文字幕 | 久久久久久国产精品免费 | 视频二区在线 | 久操综合 | 国产日韩欧美在线观看 | 欧美a级免费视频 | adn—256中文在线观看 | 九九久久精品视频 | 中文字幕一区二区三区乱码不卡 | 97视频一区| 国产视频一区精品 | 蜜臀精品久久久久久蜜臀 | 四季av综合网站 | 国产一区国产二区在线观看 | 国产中文字幕av | 深夜男人影院 | 国产精品theporn | 在线成人中文字幕 | 99久久久国产精品美女 | 国产精品久久嫩一区二区免费 | 二区三区av | 综合色婷婷 | 免费看av在线 | 久久天天躁狠狠躁亚洲综合公司 | av九九九 | 激情婷婷欧美 | 超碰在线9 | 99热999| 国产在线精品区 | 91av官网| 在线观看日韩精品视频 | 国产精品久久av | 日韩av有码在线 | 欧美日韩精品在线免费观看 | 欧美激情视频免费看 | 免费观看性生交 | 久久亚洲私人国产精品va | 日韩欧美在线观看一区二区 | 久草资源免费 | 麻豆成人小视频 | 国产99久久久国产 | 99九九热只有国产精品 | 精品美女国产在线 | 在线亚洲成人 | 久久曰视频 | 久久久久久久精 | 久久字幕网 | 亚洲精品一区二区三区高潮 | 91九色在线视频 | 亚洲毛片在线观看. | 久久久首页 | 欧美日韩1区2区 | 国产成人精品在线观看 | 在线精品观看国产 | 国产成人精品电影久久久 | 成人国产精品入口 | 午夜.dj高清免费观看视频 | 精品在线一区二区 | 一区二区三区免费在线观看 | 久久久久久免费视频 | 欧美一级日韩三级 | 波多野结衣网址 | 亚洲一二区视频 | 91在线播放国产 | 国产黑丝一区二区 | 中文字幕 国产专区 | 亚洲男人天堂2018 | 色婷婷国产 | 国产99久久久久久免费看 | 欧美黄色特级片 | 国产视频观看 | 亚洲婷久久 | 国产精品国产自产拍高清av | 亚洲欧美日本A∨在线观看 青青河边草观看完整版高清 | 国产三级午夜理伦三级 | 视频一区二区三区视频 | 国产一区福利 | 日韩二区三区 | 欧美资源在线观看 | 中文字幕色网站 | 欧美小视频在线观看 | 黄色免费观看网址 | 久久久久久免费毛片精品 | 2019中文最近的2019中文在线 | 精品国产亚洲日本 | 欧美另类老妇 | 99久热在线精品视频 | 久草免费在线视频 | 欧美激情视频在线观看免费 | 美女国内精品自产拍在线播放 | 久久免费看毛片 | 九九九九色 | 亚洲自拍自偷 | 久久不射电影院 | 婷婷综合导航 | 99这里只有精品99 | 97中文字幕 | 综合久久一本 | 97精品国产97久久久久久春色 | 在线观看你懂的网站 | 四虎影视成人精品国库在线观看 | 免费中午字幕无吗 | 人人玩人人添人人 | 黄色91在线观看 | 亚洲永久免费av | 中文字幕在线免费观看视频 | 99久久综合国产精品二区 | 麻豆免费在线视频 | 亚洲国产人午在线一二区 | 国产不卡在线播放 | 精品嫩模福利一区二区蜜臀 | 91在线精品一区二区 | 亚洲天天摸日日摸天天欢 | 天天艹天天操 | 一级免费黄视频 | av性网站 | 91热这里只有精品 | 亚洲精品成人 | 国产高清第一页 | 涩涩网站在线 | 人人舔人人爽 | 综合天天| 99re久久资源最新地址 | 干天天| 91精品国产综合久久福利 | 日韩在线字幕 | 99久热在线精品视频成人一区 | 亚洲va欧洲va国产va不卡 | 欧美午夜一区二区福利视频 | 91av原创 | 在线观看国产日韩 | 久久精品视频中文字幕 | 久插视频| 久久免费视频在线观看30 | 欧美另类调教 | 国产美女被啪进深处喷白浆视频 | 一级成人免费视频 | 久久综合九色欧美综合狠狠 | 色99视频| 欧美一二三视频 | 亚洲丝袜一区二区 | 久久综合导航 | 69精品久久久 | 国产精品久久久av | 超碰在线97国产 | 国产精品久久久久久久免费观看 | 久久精品国产免费看久久精品 | 国产69精品久久久久久 | 亚洲第一香蕉视频 | 日本黄色a级大片 | 久久99久国产精品黄毛片入口 | 国产午夜精品一区二区三区在线观看 | 热久久这里只有精品 | 国产成人99久久亚洲综合精品 | 日韩欧美视频免费在线观看 | 国产福利不卡视频 | 欧美国产在线看 | 亚洲精品国产综合99久久夜夜嗨 | 夜夜操天天 | 色噜噜日韩精品欧美一区二区 | 国际av在线| 欧美激情奇米色 | 色综合天天综合网国产成人网 | 亚洲日b视频 | 国产极品尤物在线 | 一级黄色片网站 | 久久免费播放 | 97高清视频| 欧美另类交在线观看 | 亚洲精品乱码久久久久久久久久 | 欧美性脚交 | 国产高清在线视频 | 手机av在线免费观看 | 开心色激情网 | 国产成人黄色片 | 四虎影视成人永久免费观看亚洲欧美 | 一区二区三区日韩视频在线观看 | 超碰公开在线 | 中文字幕国内精品 | 国产精品岛国久久久久久久久红粉 | 日韩av在线免费看 | 综合色综合 | 国内精品久久久久久久久久 | 国产美女无遮挡永久免费 | 一区二区 久久 | 亚洲九九影院 | 久久久久久伊人 | 成人天堂网 | 91在线操 | 手机在线黄色网址 | 日本公乱妇视频 | 国产在线色站 | 国产在线精品一区二区三区 | 最近日本韩国中文字幕 | 狠狠狠色丁香综合久久天下网 | 国产精品久久久久免费a∨ 欧美一级性生活片 | 97av超碰| 国产超碰97 | 国产视频精品网 | av高清影院| 国产视频一区二区在线观看 | 国产三级精品三级在线观看 | 免费av在线网站 | www操操 | 午夜精品一区二区三区在线 | 亚洲视频网站在线观看 | 日本三级久久久 | 国产精品一区二区久久精品爱涩 | 精品免费观看视频 | 欧美性大战 | 99久久夜色精品国产亚洲96 | 中文字幕专区高清在线观看 | 亚洲专区视频在线观看 | 夜夜夜 | 日本激情视频中文字幕 | 成人久久18免费网站麻豆 | 亚洲最大免费成人网 | 丁香婷婷自拍 | 91亚洲网站| 激情av网 | 四虎国产精品永久在线国在线 | av黄色在线 | 国产精品9999久久久久仙踪林 | 天堂av色婷婷一区二区三区 | 国产精品成人久久久久久久 | 青草草在线 | 伊人宗合网 | 去干成人网| 不卡电影免费在线播放一区 | 激情开心网站 | 天天综合五月天 | 亚洲深爱激情 | 黄色亚洲 | 四虎国产免费 | 天天操天天操天天操 | 日韩精品一区二区三区水蜜桃 | 久久久精品福利视频 | 亚洲乱亚洲乱亚洲 | 超碰成人免费电影 | 日韩专区一区二区 | 99热最新地址 | 奇米四色影狠狠爱7777 | 四虎在线免费观看 | 亚洲另类视频在线观看 | 麻豆视频在线免费 | 夜夜操网 | 国产精品一区免费观看 | 麻豆影视在线免费观看 | 国产视频一区二区在线观看 | 国产一级片播放 | 91免费在线视频 | 一区二区精品国产 | 日韩在线观看小视频 | 亚洲视频观看 | 青青河边草观看完整版高清 | 黄色日批网站 | 欧美做受高潮1 | 国产精品一区专区欧美日韩 | 亚洲精品免费在线 | 国产视频精品网 | 成人在线视频网 | 亚洲我射av | 最近日本韩国中文字幕 | 人人爽久久涩噜噜噜网站 | 国产亚洲一区 | 国产91九色蝌蚪 | 五月天.com | 又色又爽又黄高潮的免费视频 | 国产一级免费av | 九九在线国产视频 | 五月天激情综合 | 欧美a级片网站 | 亚洲一区日韩精品 | 久久人人爽 | 精品天堂av| 中文字幕 国产视频 | 成人在线黄色电影 | 国产精品中文字幕在线 | 国产精品久久久久aaaa | 欧美日韩xx | 91人人网 | 亚州精品一二三区 | 亚洲一区二区精品3399 | 99视频免费看| 国产免费影院 | 中文字幕久久网 | 正在播放一区二区 | 亚洲一级久久 | 18pao国产成视频永久免费 | 国产成人综合在线观看 | 日日夜夜天天人人 | 国产一区成人在线 | 九九九电影免费看 | av电影在线免费观看 | 免费在线| 中文字幕日本在线观看 | 日日干天天爽 | 热99在线视频 | 最新极品jizzhd欧美 | 久久精品久久精品久久39 | 亚洲少妇激情 | 成人黄色电影在线 | 亚洲成人黄色网址 | 国产中文字幕视频在线 | 国语麻豆| 五月激情久久 | 狠狠色丁香久久婷婷综 | 超碰在线97国产 | 五月天婷婷在线观看视频 | 毛片3| av青草 | 久久久国产高清 | www.888.av | 亚洲综合小说电影qvod | 国产精品久久久久久久久久久免费看 | 亚州视频在线 | 免费色视频网站 | 日韩一区在线免费观看 | 成人一区二区三区在线观看 | 麻豆av一区二区三区在线观看 | 黄色成人在线网站 | 在线观看免费观看在线91 | 免费无遮挡动漫网站 | 日韩欧美在线观看 | 久久久久女人精品毛片 | 五月激情丁香婷婷 | 久久只有精品 | 在线免费看片 | 又黄又爽又无遮挡免费的网站 | 亚洲精品理论片 | 日韩va欧美va亚洲va久久 | 中文字幕av在线 | 久久刺激视频 | 日韩午夜在线 | 亚洲aⅴ在线观看 | 九九九九九国产 | www.夜夜爽 | 国际精品久久 | 九草在线视频 | 免费在线激情视频 | 国产美女精品视频免费观看 | 91视频 - x99av | 玖玖精品视频 | 在线免费观看涩涩 | 久久99在线视频 | 久久久黄色免费网站 | 超碰在线公开免费 | 丰满少妇在线观看资源站 | 午夜精品久久久久久中宇69 | a'aaa级片在线观看 | 成人av资源站 | 日韩欧美在线一区二区 | 在线亚洲欧美日韩 | 夜夜干夜夜 | 一区二区三区不卡在线 | 丁香色综合 | 国产 视频 久久 | 美女网站视频色 | 日韩网站视频 | 麻豆91精品91久久久 | 日韩区欧美久久久无人区 | 欧美日韩a视频 | 国产免费成人 | 日韩 在线 | 午夜免费视频网站 | 久久公开免费视频 | 日韩在线播放欧美字幕 | 99婷婷| 顶级欧美色妇4khd | 国产欧美在线一区 | 97av视频 | 欧美另类一二三四区 | 日韩中文在线观看 | 精品久久一二三区 | jizz欧美性9 国产一区高清在线观看 | 91av在线精品 | 国产日韩精品在线 | 正在播放一区 | 久久国产欧美日韩精品 | 国产九九九视频 | 特级xxxxx欧美 | 日韩欧美一区二区三区在线观看 | 久久影视精品 | 青青啪| 国产视频一区在线 | 国产a级片免费观看 | 日韩高清精品免费观看 | 天天伊人网 | 亚洲国产激情 | 六月丁香六月婷婷 | 高清中文字幕av | 一级做a爱片性色毛片www | 日韩国产精品久久久久久亚洲 | 日韩精品黄 | 国产精品第二页 | 国产999久久久 | 91精品国产福利 | 国产一区二区三区免费观看视频 | 国产亚洲精品久久久久久 | 人人精久 | 日韩av不卡播放 | 亚洲黄色一级大片 | 一区二区三区福利 | 欧美一级黄色片 | 亚洲婷婷在线 | 亚洲资源网 | 免费能看的黄色片 | 少妇bbb搡bbbb搡bbbb | 草久热 | 五月天免费网站 | 久久免费黄色大片 | 国产成人福利在线观看 | 91亚洲欧美 | 三级黄色网络 | 黄色三级久久 | 午夜性生活片 | 射久久 | 最近高清中文字幕在线国语5 | 人人讲下载 | 日韩区欧美久久久无人区 | 欧美日韩一区久久 | 国语精品久久 | 天天干天天干天天射 | 亚洲精品男人的天堂 | 一区精品在线 | 欧美激情另类 | 国产精品精品国产色婷婷 | 国产99久久久国产 | 十八岁免进欧美 | 精品国产a | 91精品国产自产91精品 | 麻豆传媒电影在线观看 | 久久久久草| 91av亚洲| 黄色片网站| 综合国产在线 | 久久免费电影网 | 国产精品视频久久久 | 久久综合九色综合久久久精品综合 | 亚州精品在线视频 | 国产美女精品视频 | 国产96精品 | 成人在线观看免费视频 | 99久久一区 | 久久精国产 | 色综合天天狠天天透天天伊人 |