tonglin0325的个人主页

数据仓库建模的一些理论

1.数据分层

数据明细层:DWD(Data Warehouse Detail)

数据中间层:DWM(Data WareHouse Middle)

数据服务层:DWS(Data WareHouse Servce)

数据应用层:ADS(Application Data Service)

2.数仓建模方法

在数据仓库模型中,星型模型和雪花型模型是两个常用的设计模式。参考:数据仓库系列:星型模型和雪花型模型

1.星型模型

星型模型是一种简单的数据仓库模型,也是最常见的模型之一。在星型模型中,中心表(称为业务事实表)连接到几个维度表(称为业务维度表)。维度表中包含了业务的各个特征,如时间、区域、产品等。

在 SQL 中,我们可以使用以下语句来创建一个星型模型:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
CREATE TABLE fact_sales ( # 都是key
sales_id INT PRIMARY KEY,
date_key INT,
product_key INT,
store_key INT,
sales_amount DECIMAL(15,2)
);

CREATE TABLE dim_date (
date_key INT PRIMARY KEY,
date_full DATE,
year INT,
quarter INT,
month INT,
day_of_week CHAR(9),
holiday VARCHAR(32)
);

CREATE TABLE dim_product (
product_key INT PRIMARY KEY,
product_name VARCHAR(128),
category VARCHAR(32),
subcategory VARCHAR(32)
);

CREATE TABLE dim_store (
store_key INT PRIMARY KEY,
store_name VARCHAR(128),
city VARCHAR(32),
state VARCHAR(2),
country VARCHAR(64)
);

2.雪花型模型

雪花型模型是在星型模型基础上的扩展,因其形似雪花而得名。这种模型在星型模型的基础上,将维度表拆分成更小的表形式,形成多层表的结构。

全文 >>

MySQL学习笔记——索引原理

1.索引(index)

可以通过在数据库中创建index来加速对表的查询,index可以避免对表的一个全面扫描。对于主键和唯一键,会自动在上面创建索引。

  • 通过使用快速路径访问方法快速定位数据,减少了磁盘的I/O
  • 与表独立存放,但不能独立存在,必须属于某个表
  • 由数据库自动维护,表被删除时,该表上的索引自动被删除

索引的原理:当以某个字段建立一个索引的时候,数据库就会生成一个索引页,索引页不单单保存索引的数据,还保存了索引在数据库的具体的物理地址。

1
2
3
4
5
6
7
8
9
10
11
# 手动创建索引
CREATE INDEX index_tb_dept_name
ON tb_dept(NAME);

# 使用索引,在where之后加上索引,提高查询效率
SELECT * FROM tb_dept WHERE NAME='Tom'

# 重建索引
drop index index_name;
create index index_name on table(column);

注意:如果表的列很少,不适合建立索引。当执行过很多次的insert、delete、update后,会出现索引碎片。影响查询速度,我们应该对索引进行重组。

**索引列最好设置为 NOT NULL**,这通常可以提升查询效率和简化索引操作。

索引失效的场景:

  • 当我们使用左或者左右模糊匹配的时候,也就是 like %xx 或者 like %xx%这两种方式都会造成索引失效;
  • 当我们在查询条件中对索引列做了计算、函数、类型转换操作,这些情况下都会造成索引失效;
  • 联合索引要能正确使用需要遵循最左匹配原则,也就是按照最左优先的方式进行索引的匹配,否则就会导致索引失效。
  • 在 WHERE 子句中,如果在 OR 前的条件列是索引列,而在 OR 后的条件列不是索引列,那么索引会失效。

参考:https://xiaolincoding.com/mysql/index/index_interview.html#有什么优化索引的方法?

https://xiaolincoding.com/mysql/index/index_lose.html#索引失效有哪些?

2.常见索引的种类

主键索引 PRIMARY、唯一索引 UNIQUE、普通索引 INDEX(多字段为组合索引)、全文索引 FULLTEXT、空间索引 SPATIAL

参考:深入理解MySQL索引原理和实现——为什么索引可以加速查询?

1、主键索引

即主索引,根据主键pk_clolum(length)建立索引,不允许重复,不允许空值;

1
2
ALTER TABLE 'table_name' ADD PRIMARY KEY pk_index('col');

全文 >>

Python爬虫——基于ubuntu-desktop的selenium爬虫

基于`selenium``/standalone-chrome```镜像启动的容器环境,没有linux桌面,如果使用vnc连上去之后,如果在可视化界面上做一些操作的话,是不支持的。

有一个解决方案就是使用linux桌面镜像+自行安装chrome环境的方式,既可以使用selenium控制chrome浏览器,也可以在linux桌面上进行一些可视化操作,比如创建文件夹,运行可执行快捷方式等。

这里使用的镜像是 dorowu/ubuntu-desktop-lxde-vnc,是一个ubuntu桌面镜像,使用的LXDE桌面,版本较老,但是比较轻量,对比其他桌面,如下

|特性|XFCE|LXQt|LXDE
|——
|基础组件|GTK3|Qt5|GTK2
|性能|中等轻量|最轻量|最轻量(但老旧)
|启动速度|快|很快|很快
|兼容性|高,成熟|新但稳定|老旧,已不维护
|外观|稍现代,有主题支持|现代,类似 KDE 风格|过时界面
|内存占用(冷启动)|250–350MB|180–250MB|~150–200MB
|桌面体验|完整、成熟|简洁、现代|极简(不推荐新项目)
|维护状态|活跃(2025 仍在更新)|活跃(Lubuntu 默认桌面)|停止维护(迁移到 LXQt)
|VNC 兼容性|✅ 非常好|✅ 好|⚠️ 偶有显示异常
|推荐用途|通用桌面 / 稳定生产环境|超轻量容器 / 云桌面|老版本兼容场景

 dorowu/ubuntu-desktop-lxde-vnc 最新的ubuntu版本是22.04,虽然已经有几年没有更新,但是也不算非常过时

1.拉取镜像

1
2
docker pull dorowu/ubuntu-desktop-lxde-vnc:focal

2.启动容器

1
2
docker run -d -p 6080:80 -p 5900:5900 -e VNC_PASSWORD=mypassword -v /dev/shm:/dev/shm dorowu/ubuntu-desktop-lxde-vnc:focal

可以使用vnc通过5900端口连上ubuntu桌面

全文 >>

Flink学习笔记——Broadcast State

使用broadcast state实现动态配置更新,即双流:一个数据流,一个配置流

1
2
https://flink.apache.org/2019/06/26/broadcast-state.html

可以参考官方文档

1
2
https://ci.apache.org/projects/flink/flink-docs-release-1.13/docs/dev/datastream/fault-tolerance/broadcast_state/

例子:Flink使用Broadcast State实现流处理配置实时更新

 

Mac下安装minikube

1.安装kubectl命令

1
2
brew install kubectl

如果想安装指定版本的kubectl

1
2
3
4
5
curl -LO "https://dl.k8s.io/release/v1.20.0/bin/darwin/amd64/kubectl"
chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl
sudo chown root: /usr/local/bin/kubectl

验证版本,会打印出client端和server端的版本,官方建议2个版本直接版本相差不要大于+/-1

1
2
3
4
kubectl version
Client Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.0", GitCommit:"af46c47ce925f4c4ad5cc8d1fca46c7b77d13b38", GitTreeState:"clean", BuildDate:"2020-12-08T17:59:43Z", GoVersion:"go1.15.5", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.7", GitCommit:"132a687512d7fb058d0f5890f07d4121b3f0a2e2", GitTreeState:"clean", BuildDate:"2021-05-12T12:32:49Z", GoVersion:"go1.15.12", Compiler:"gc", Platform:"linux/amd64"}

  

2.下载和安装minikube

1
2
3
4
5
6
7
8
9
➜  /Users/lintong/Downloads $ curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-darwin-amd64

% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 68.6M 100 68.6M 0 0 9365k 0 0:00:07 0:00:07 --:--:-- 11.0M
➜ /Users/lintong/Downloads $ sudo install minikube-darwin-amd64 /usr/local/bin/minikube

Password:

参考

1
2
https://minikube.sigs.k8s.io/docs/start/

如果要安装指定版本的话,请到下面的地址下载

1
2
https://github.com/kubernetes/minikube/releases

全文 >>

Mac下安装mongodb

1.添加mongo的仓库

1
brew tap mongodb/brew

2.安装mongodb

1
brew install mongodb-community@4.4

参考:Mac OSX 平台安装 MongoDB

安装成功

3.打开mongo shell

1
2
/usr/local/opt/mongodb-community@4.4/bin/mongo xxx:27017/your_db

如果是mongo 6.0的话,是没有mongo命令的,需要额外安装mongosh,下载地址

1
2
https://www.mongodb.com/try/download/shell

4.查询数据

查看db

1
2
show dbs

全文 >>

Spark学习笔记——rdd,dataframe和dataset转换

1.生成RDD

1
2
val rdd: RDD[(String, Int)] = sc.parallelize(Seq(("cat", 30), ("fox", 40)))

2.生成case class RDD

1
2
3
case class WordCount(word: String, count: Long)
val rdd: RDD[WordCount] = sc.parallelize(Seq(WordCount("dog", 50), WordCount("cow", 60)))

3.rdd转df,注意这里需要隐式转换

1
2
3
4
import spark.implicits._

val df = rdd.toDF()

4.rdd转ds,注意 WordCount 需要写在主函数之外

1
2
3
4
import spark.implicits._

val ds: Dataset[WordCount]= rdd.toDS()

5.df转ds

1
2
val ds: Dataset[WordCount]= df.as[WordCount]

6.thrift class rdd转df

1
2
val df = spark.createDataFrame(rdd, classOf[MyBean])

7.thrift class df转ds,需要为thrift class指定encoder

1
2
val ds = df.as[MyBean](Encoders.bean(classOf[MyBean]))

或者

1
2
3
4
implicit val mapEncoder = Encoders.bean(classOf[MyBean])

val ds = df.as[MyBean]

8.avro class rdd转df,参考

1
2
https://stackoverflow.com/questions/47264701/how-to-convert-rddgenericrecord-to-dataframe-in-scala

全文 >>

使用tweak插件修改HTTP请求

tweak是一款可以对request请求的response进行修改的浏览器插件,区别于ModHeader只能对header进行修改,tweak可以对请求的request payload(收费)和response payload(免费)进行拦截和修改。

下图是tweak的界面

同类产品还有requestlytweak的修改HTTP请求response功能是免费的requestly修改API response和request body都是需要收费版本才提供支持

参考:requestly 代理插件

Firefox tweak插件安装地址

https://addons.mozilla.org/en-US/firefox/addon/tweak-extension/

Chrome tweak插件安装地址

https://chromewebstore.google.com/detail/feahianecghpnipmhphmfgmpdodhcapi

全文 >>