ToB企服应用市场:ToB评测及商务社交产业平台

标题: 大数据-162 Apache Kylin 全量增量Cube的构建 Segment 超详细记录 多图 [打印本页]

作者: 农妇山泉一亩田    时间: 2024-10-14 16:19
标题: 大数据-162 Apache Kylin 全量增量Cube的构建 Segment 超详细记录 多图
点一下关注吧!!!非常感谢!!连续更新!!!

目前已经更新到了:


章节内容

上节我们完成了如下的内容:


增量 Cube


Segment

Kylin将Cube划分为多个Segment(对应就是HBase中的一个表)


Segment示意图


例如:以下为针对某个Cube的Segment

全量构建与增量构建

全量构建

在全量构建中:

增量构建

在增量构建中:

相互对比


全量构建与增量构建的Cube查询的方式对比:
全量构建Cube:

增量构建Cube:

对于小数据量的Cube,大概常常需要全表更新的Cube,使用全量构建需要更少的运维精力,以少量的重复计算降低生产情况中的维护复杂度。
对于大数据量的Cube,例一个包含较长历史数据的Cube,如果每天更新,那么大量的资源是在用于重复计算,这个情况下可以考虑使用增量构建。
增量构建Cube过程

指定分割时间列

增量构建Cube的定义必须包含一个时间维度,用来分割差别的Segment,如许的维度称为分割时间列(Partition Date Column)。
增量构建过程


增量Cube构建

步调:定义数据源 => 定义Model => 定义Cube => 构建Cube
SQL 语句

  1. -- 数据结构类似,只是改为了分区表
  2. drop table wzk_kylin.dw_sales1;
  3. create table wzk_kylin.dw_sales1(
  4.   id string,
  5.   channelId string,
  6.   productId string,
  7.   regionId string,
  8.   amount int,
  9.   price double
  10. )
  11. partitioned by (dt string)
  12. ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
  13. -- 加载数据
  14. load data local inpath "dw_sales20240101_data.txt"
  15. into table wzk_kylin.dw_sales1
  16. partition(dt="2024-01-01");
  17. load data local inpath "dw_sales20240102_data.txt"
  18. into table wzk_kylin.dw_sales1
  19. partition(dt="2024-01-02");
  20. load data local inpath "dw_sales20240103_data.txt"
  21. into table wzk_kylin.dw_sales1
  22. partition(dt="2024-01-03");
  23. load data local inpath "dw_sales20240104_data.txt"
  24. into table wzk_kylin.dw_sales1
  25. partition(dt="2024-01-04");
复制代码
生成数据

同样,我们先编写一个脚本来生成对应的数据:
  1. import random
  2. # 设置参数
  3. dates = ["2024-01-01", "2024-01-02", "2024-01-03", "2024-01-04"]
  4. num_records_per_file = 100
  5. # 定义可能的值
  6. channel_ids = ['C001', 'C002', 'C003', 'C004']
  7. product_ids = ['P001', 'P002', 'P003', 'P004']
  8. region_ids = ['R001', 'R002', 'R003', 'R004']
  9. # 生成数据
  10. for dt in dates:
  11.     output_file = f'dw_sales{dt.replace("-", "")}_data.txt'
  12.    
  13.     with open(output_file, 'w') as f:
  14.         for i in range(num_records_per_file):
  15.             record_id = f"{i+1:04d}"
  16.             channel_id = random.choice(channel_ids)
  17.             product_id = random.choice(product_ids)
  18.             region_id = random.choice(region_ids)
  19.             amount = random.randint(1, 100)
  20.             price = round(random.uniform(10.0, 500.0), 2)
  21.             
  22.             line = f"{record_id},{channel_id},{product_id},{region_id},{amount},{price}\n"
  23.             f.write(line)
  24.    
  25.     print(f"{num_records_per_file} records have been written to {output_file}")
  26. print("All data files have been generated.")
复制代码
执行的效果如下图所示:

上传数据

通过你习惯的方式,将这几个txt上传到服务器上,预备执行:

执行脚本

  1. hive -f kylin_partition.sql
复制代码
执行效果如下图:

加载数据源

Load Table From Tree

选择刚才创建的表,wzk_kylin.dw_sales1:

定义Model

增量构建的Cube需要指定分割时间列,例如:将日期分区字段添加到维度列中:
Data Model:New Join Condition,需要设置好几个:

设置成如下的效果:

维度设置如下图所示:

度量选择 AMOUNT 和 PRICE,末了的设置:

定义Cube

填写名字等跳过,维度需要添加 DT、其他都要:

设置完的效果如下图:

度量设置如下:(Bulk Add Measures 快速设置)

剩余的信息都默认填写即可:

构建Cube

接下来构建Cube的时候,举行Build:

选部分的日期,就不选全部数据了:

继续等待构建完毕:

查看Segment

刚才我们构建了

2024-01-01 到 2024-01-02 完成之后,我们继续使命:

2024-01-02 到 2024-01-03 完成之后,我们继续使命:

漫长等待,使命都完成之后如下图所示:

查询测试

第一部分:按日期和地区汇总销售数据
  1. -- 第一部分查询:按日期和地区汇总销售数据
  2. SELECT
  3.     t1.dt,
  4.     t2.regionname,
  5.     SUM(t1.price) AS total_money,
  6.     SUM(t1.amount) AS total_amount,
  7.     MAX(t1.price) AS max_price,
  8.     MIN(t1.amount) AS min_amount
  9. FROM
  10.     dw_sales1 t1
  11. JOIN
  12.     dim_region t2
  13. ON
  14.     t1.regionid = t2.regionid
  15. GROUP BY
  16.     t1.dt,
  17.     t2.regionname
  18. ORDER BY
  19.     t1.dt;
复制代码
运行的效果如下图所示:

另一部分:按日期、地区和产物汇总销售数据
  1. -- 第二部分查询:按日期、地区和产品汇总销售数据
  2. SELECT
  3.     t1.dt,
  4.     t2.regionid,
  5.     t2.regionname,
  6.     t3.productid,
  7.     t3.productname,
  8.     SUM(t1.price) AS total_money,
  9.     SUM(t1.amount) AS total_amount
  10. FROM
  11.     dw_sales1 t1
  12. INNER JOIN
  13.     dim_region t2
  14. ON
  15.     t1.regionid = t2.regionid
  16. INNER JOIN
  17.     dim_product t3
  18. ON
  19.     t1.productid = t3.productid
  20. GROUP BY
  21.     t1.dt,
  22.     t2.regionid,
  23.     t2.regionname,
  24.     t3.productid,
  25.     t3.productname
  26. ORDER BY
  27.     t1.dt,
  28.     t2.regionname,
  29.     t3.productname;
复制代码
查询效果如下图所示:


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4