【摘要】 在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;
点击这里,了解更多精彩内容