Apache CarbonData 2.0 开发实用系列之一:与Spark SQL集成使用
【准备CarbonData】
在浏览器地址栏输入以下链接,下载carbondata 2.0.1发布包
链接:https://dist.apache.org/repos/dist/release/carbondata/2.0.1/apache-carbondata-2.0.1-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;
- 点赞
- 收藏
- 关注作者
评论(0)