Apache CarbonData 2.0 开发实用系列之一:与Spark SQL集成使用

举报
david_caiqiang 发表于 2020/05/25 20:42:36 2020/05/25
【摘要】 Apache CarbonData 是一个支持索引和物化视图的ACID数据湖,在5月初正式发布了2.0 RC2,这个版本在索引、物化视图、数据湖能力、ACID等方面均有增强。接下来给大家带来关于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;

   

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。