Apache CarbonData 2.0 開發實用系列之一:與Spark SQL集成使用

【摘要】 在Spark SQL中使用CarbonData

【準備CarbonData】

在瀏覽器地址欄輸入以下鏈接,點擊"download"按鈕下載已經準備好的CarbonData jar包

鏈接:https://github.com/QiangCai/carbonjars/blob/master/master/apache-carbondata-2.1.0-SNAPSHOT-bin-spark2.4.5-hadoop2.7.2.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;

  

 lineitem.txt

 

點擊這裏,瞭解更多精彩內容

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章