大数据-159 Apache Kylin 构建Cube 准备和测试数据

ops/2024/10/15 19:48:26/

点一下关注吧!!!非常感谢!!持续更新!!!

目前已经更新到了:

  • Hadoop(已更完)
  • HDFS(已更完)
  • MapReduce(已更完)
  • Hive(已更完)
  • Flume(已更完)
  • Sqoop(已更完)
  • Zookeeper(已更完)
  • HBase(已更完)
  • Redis (已更完)
  • Kafka(已更完)
  • Spark(已更完)
  • Flink(已更完)
  • ClickHouse(已更完)
  • Kudu(已更完)
  • Druid(已更完)
  • Kylin(正在更新…)

章节内容

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

  • Apache Kylin 安装
  • Apache Kylin 部署
  • Apache Kylin 集群模式

在这里插入图片描述

Cube 介绍

Apache Kylin 是一个开源的分布式分析引擎,专注于提供大数据的实时OLAP(在线分析处理)能力。Cube(立方体)是 Apache Kylin 的核心概念之一,通过预计算大规模数据的多维数据集合,加速复杂的 SQL 查询。下面详细介绍 Cube 的关键点:

Cube 的基本概念

Kylin 中的 Cube 是通过对一组事实表(通常是业务数据表)进行多维建模后,生成的预计算数据结构。Cube 涉及对多维数据的度量和维度的组合,从而可以在查询时通过检索预先计算的结果来显著减少计算开销。

  • 维度(Dimension):数据中用于分组、筛选和切片的数据字段,例如时间、地区、产品等。
  • 度量(Measure):通常是需要进行聚合计算的数据字段,例如销售额、订单数等。
  • Cuboid:每个 Cube 由多个 Cuboid 构成,Cuboid 是一个特定维度组合的子集。Cube 中每种维度组合都会生成一个 Cuboid,每个 Cuboid 存储了该组合下的预聚合结果。

Cube 的创建过程

  • 数据建模:首先在 Kylin 中创建一个数据模型(Data Model),这个模型定义了事实表和维度表之间的关系,类似于星型或雪花型模式。模型中也定义了需要聚合的度量字段。
  • Cube 设计:基于数据模型设计 Cube,指定 Cube 的维度和度量。Kylin 会根据定义自动计算所有可能的维度组合(Cuboid)。
  • 构建 Cube:构建过程会读取底层数据源(如 Hive、HBase、Kafka),然后根据指定的维度和度量生成每个 Cuboid 的预计算数据。这些预计算结果存储在 HBase 或其他存储引擎中。

Cube 的查询与优化

  • 查询加速:当有 SQL 查询请求到达时,Kylin 会根据查询所涉及的维度组合,选择合适的 Cuboid 返回结果,避免了实时计算,极大地提高了查询性能。
  • Cube 优化:为了控制 Cube 大小和加速构建,Kylin 支持裁剪 Cube,通过配置仅生成部分 Cuboid,这称为“Aggregation Group”,可以减少冗余计算。

实时 OLAP

Kylin 4.0 引入了对实时 OLAP 的支持,使用 Kafka 作为实时数据流输入,构建实时 Cube。通过使用 Lambda 架构,Kylin 可以支持实时和批处理数据的整合分析。

Cube 的典型应用场景

  • 大规模数据分析:Cube 适用于分析超大规模的数据集,通过预计算方式加速查询。
  • 实时分析:实时 Cube 允许用户在近乎实时的基础上分析流数据。
  • 商业智能(BI)工具的集成:Kylin 提供与 Tableau、Power BI 等常见 BI 工具的集成,用户可以使用熟悉的 SQL 查询语言进行复杂的多维分析。

前置要求

需要你配置并且启动好了 Kylin!
由于我是在 h122.wzk.icu 节点上启动的,所以下面的操作都在 h122 节点上,后续没有详细说明就是在该机器上了。

准备数据

在这里插入图片描述

准备数据

将4个数据文件:

  • dw_sales_data.txt
  • dim_channel_data.txt
  • dim_product_data.txt
  • dim_region_data.txt

我写了几个脚本来辅助生成数据
在这里插入图片描述

dw_sales_data

import random
import datetime# 设置参数
num_records = 1000
output_file = 'dw_sales_data.txt'# 定义可能的值
channel_ids = ['C001', 'C002', 'C003', 'C004']
product_ids = ['P001', 'P002', 'P003', 'P004']
region_ids = ['R001', 'R002', 'R003', 'R004']
base_date = datetime.date(2024, 1, 1)# 生成数据
with open(output_file, 'w') as f:for i in range(num_records):record_id = f"{i+1:04d}"date1 = (base_date + datetime.timedelta(days=random.randint(0, 365))).strftime('%Y-%m-%d')channel_id = random.choice(channel_ids)product_id = random.choice(product_ids)region_id = random.choice(region_ids)amount = random.randint(1, 100)price = round(random.uniform(10.0, 500.0), 2)line = f"{record_id},{date1},{channel_id},{product_id},{region_id},{amount},{price}\n"f.write(line)print(f"{num_records} records have been written to {output_file}")

生成数据如下图所示:
在这里插入图片描述

dim_channel_data

# 设置参数
output_file = 'dim_channel_data.txt'# 定义渠道ID和渠道名称
channels = [('C001', 'Online Sales'),('C002', 'Retail Store'),('C003', 'Wholesale'),('C004', 'Direct Sales')
]# 生成数据
with open(output_file, 'w') as f:for channel_id, channel_name in channels:line = f"{channel_id},{channel_name}\n"f.write(line)print(f"Channel data has been written to {output_file}")

生成数据如下图所示:
在这里插入图片描述

dim_product_data

# 设置参数
output_file = 'dim_product_data.txt'# 定义产品ID和产品名称
products = [('P001', 'Smartphone'),('P002', 'Laptop'),('P003', 'Tablet'),('P004', 'Smartwatch'),('P005', 'Camera'),('P006', 'Headphones'),('P007', 'Monitor'),('P008', 'Keyboard'),('P009', 'Mouse'),('P010', 'Printer')
]# 生成数据
with open(output_file, 'w') as f:for product_id, product_name in products:line = f"{product_id},{product_name}\n"f.write(line)print(f"Product data has been written to {output_file}")

生成数据如下图所示:
在这里插入图片描述

dim_region_data

# 设置参数
output_file = 'dim_region_data.txt'# 定义区域ID和区域名称
regions = [('R001', 'North America'),('R002', 'Europe'),('R003', 'Asia'),('R004', 'South America'),('R005', 'Africa'),('R006', 'Australia'),('R007', 'Antarctica')
]# 生成数据
with open(output_file, 'w') as f:for region_id, region_name in regions:line = f"{region_id},{region_name}\n"f.write(line)print(f"Region data has been written to {output_file}")

生成的数据如下图所示:
在这里插入图片描述

kylin_examplessql_188">kylin_examples.sql

-- 创建订单数据库、表结构
create database if not exists `wzk_kylin`;
-- 1、销售表:dw_sales
-- id 唯一标识
-- date1 日期
-- channelId 渠道ID
-- productId 产品ID
-- regionId 区域ID
-- amount 数量
-- price 金额
create table wzk_kylin.dw_sales(id string,date1 string,channelId string,productId string,regionId string,amount int,price double
)ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
-- 2、渠道表:dim_channel
-- channelId 渠道ID
-- channelName 渠道名称
create table wzk_kylin.dim_channel(channelId string,channelName string
)ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
-- 3、产品表:dim_product
create table wzk_kylin.dim_product(productId string,productName string
)ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
--4、区域表:dim_region
create table wzk_kylin.dim_region(regionId string,regionName string
)ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';-- 导入数据
LOAD DATA LOCAL INPATH '/opt/wzk/kylin_test/dw_sales_data.txt'
OVERWRITE INTO TABLE wzk_kylin.dw_sales;
LOAD DATA LOCAL INPATH '/opt/wzk/kylin_test/dim_channel_data.txt'
OVERWRITE INTO TABLE wzk_kylin.dim_channel;
LOAD DATA LOCAL INPATH '/opt/wzk/kylin_test/dim_product_data.txt'
OVERWRITE INTO TABLE wzk_kylin.dim_product;
LOAD DATA LOCAL INPATH '/opt/wzk/kylin_test/dim_region_data.txt'
OVERWRITE INTO TABLE wzk_kylin.dim_region;

运行数据

我们需要把刚才的数据上传到指定目录上,/opt/wzk/目录下。

cd /opt/wzk/kylin_test

我已经上传到服务器上了:
在这里插入图片描述

SQL文件也记得上传上去
在这里插入图片描述
执行Hive:

hive -f kylin_examples.sql

执行结果如下图所示:
在这里插入图片描述

测试数据

我们需要启动Hive

hive

执行结果如下图所示:
在这里插入图片描述
执行如下的指令:

use wzk_kylin;
select date1, sum(price) as total_money, sum(amount) as
total_amount
from dw_sales
group by date1;

执行结果如下图所示:
在这里插入图片描述


http://www.ppmy.cn/ops/126085.html

相关文章

YOLOv10改进策略【注意力机制篇】| 2024 SCSA-CBAM 空间和通道的协同注意模块

一、本文介绍 本文记录的是基于SCSA-CBAM注意力模块的YOLOv10目标检测改进方法研究。现有注意力方法在空间-通道协同方面未充分挖掘其潜力,缺乏对多语义信息的充分利用来引导特征和缓解语义差异。SCSA-CBAM注意力模块构建一个空间-通道协同机制,使空间注意力引导通道注意力增…

单链表的应⽤

⽬录 1. 单链表经典算法OJ题⽬ 2. 基于单链表再实现通讯录项⽬ ——————————————————————————————————————————— 正文开始 单链表经典算法 1. 链表经典算法OJ题⽬ 1.1 单链表相关经典算法OJ题1:移除链表元素 1.2 …

Vue学习笔记(Snippets、Pinia)

一、Vue3好用的VSCode插件 Vue VSCode Snippets 作用:在vue3文件中输出v3,选择模板后,可生成模板代码 自定义模板的方法: 打开vue.json,修改模板 二、Pinia 1.简介 Pinia是一个轻量级的状态管理库 Pinia官网 Pinia | The intuit…

如何查看是否是ip转发?

一、什么是ip转发 ip转发指的是路由器或者其他网络设备把接受的ip数据包从一个接口转发到另一个ip的过程。在ip转发的过程中,如果某个设备接收到某个数据包时发现该设备不是此数据包的最终目的地,它就会根据路由表中的信息将此数据包转发到下一个适合的…

python——pyecharts数据可视化堆叠面积图

堆叠面积图具有以下几个重要作用: 一、展示总量与分量关系 堆叠面积图可以清晰地展示多个数据系列的总量以及各个分量在总量中所占的比例。通过不同颜色或阴影的区域,你可以直观地看出每个数据系列对整体的贡献程度。例如,在分析公司不同业…

【LeetCode】动态规划—1964. 找出到每个位置为止最长的有效障碍赛跑路线(附完整Python/C++代码)

动态规划—1964. 找出到每个位置为止最长的有效障碍赛跑路线 前言题目描述基本思路1. 问题定义2. 理解问题和递推关系动态规划递推公式:公式推导:伪代码:核心思想: 3. 解决方法动态规划 二分查找 4. 进一步优化5. 小总结 Python代…

ASP.NET Core8.0学习笔记(二十一)——EFCore关系配置API

一、关系配置API概述 当我们需要指定一个字段作为外键,而这个外键又不符合以上四种约定时,就需要在IEntityTypeConfiguration实现类(对应的配置类)中使用Fluent API直接配置外键。理论上可以通过API直接指定一个属性,…

GC 算法

垃圾回收主要在:堆区和方法区 # 标记阶段:引用计数算法 在堆里存放着几乎所有的 Java 对象实例,在 GC 执行垃圾回收之前,首先需要区分出内存中哪些是存活对象,哪些是已经死亡的对象。只有被标记为已经死亡的对象&…