【摘要】 在Spark SQL中使用CarbonData
【準備CarbonData】
在瀏覽器地址欄輸入以下鏈接,點擊"download"按鈕下載已經準備好的CarbonData jar包
或者按以下指南編譯carbondata源碼
1. 下載源碼
git clone https://github.com/apache/carbondata.git
2. 編譯源碼
參考:https://github.com/apache/carbondata/blob/master/build/README.md
3. 編譯完成後可以在如下目錄找到CarbonData包
./assembly/target/scala-2.1x/apache-carbondata*.jar
【準備Spark】
1. 下載spark 2.4.5
下載頁面:https://spark.apache.org/downloads.html
2. 本地啓動spark-sql
./bin/spark-sql \
--conf spark.sql.extensions=org.apache.spark.sql.CarbonExtensions \
--jars <CarbonData jar 包路徑>
【使用CarbonData】
1. 創建database
CREATE DATABASE carbondb location '<指定的database目錄>';
2. 設置爲當前database
USE carbondb;
3. 創建CarbonData表(使用TPC-H lineitem表舉例)
創建lineitem在線商品信息表,在OPTIONS中sort_scope使用global_sort,並將sort_columns設置l_shipdate
更多相關資料參考:https://github.com/apache/carbondata/blob/master/docs/ddl-of-carbondata.md
CREATE TABLE IF NOT EXISTS lineitem(
l_orderkey INT,
l_partkey INT ,
l_suppkey STRING,
l_linenumber INT,
l_quantity DOUBLE,
l_extendedprice DOUBLE,
l_discount DOUBLE,
l_tax DOUBLE,
l_returnflag STRING,
l_linestatus STRING,
l_shipdate DATE,
l_commitdate DATE,
l_receiptdate DATE,
l_shipinstruct STRING,
l_shipmode STRING,
l_comment STRING)
USING carbondata
OPTIONS('sort_scope'='global_sort', 'sort_columns'='l_shipdate');
4. 入庫數據
支持直接入庫TPC-H dbgen生成的CSV格式的數據文件lineitem.tbl
或者直接使用本文附件中的lineitem.txt文件,包含了1000條樣例數據;
入庫期間將使用表屬性sort_scope和sort_columns的信息對輸入數據進行排序處理。
更多相關資料參考:https://github.com/apache/carbondata/blob/master/docs/dml-of-carbondata.md
LOAD DATA INPATH 'lineitem.tbl/txt文件路徑' INTO TABLE lineitem OPTIONS('delimiter'='|', 'header'='false');
5. 查詢
TPC-H的query1語句查詢指定發貨日期之前的定價彙總報告;語句中含有l_shipdate的過濾操作,由於入庫時已按該列對數據進行排序,因此查詢時在driver側通過索引能精確定位出含有過濾條件的數據塊,減少了掃描的數據塊數量。
另外,carbondata列式存儲格式支持push down projection,僅需要掃描語句中使用了的列數據;同時又支持push down filter, 僅需要掃描符合過濾條件的列數據,進一步減少掃描的數據量。
SELECT
l_returnflag,
l_linestatus,
sum(l_quantity) AS sum_qty,
sum(l_extendedprice) AS sum_base_price,
sum(l_extendedprice*(1-l_discount)) AS sum_disc_price,
sum(l_extendedprice*(1-l_discount)*(1+l_tax)) AS sum_charge,
avg(l_quantity) AS avg_qty,
avg(l_extendedprice) AS avg_price,
avg(l_discount) AS avg_disc,
count(*) AS count_order
FROM lineitem
WHERE l_shipdate <= date('1993-09-02')
GROUP BY l_returnflag, l_linestatus
ORDER BY l_returnflag, l_linestatus;
點擊這裏,瞭解更多精彩內容