一、工具:AI -- Cline、VS code和MCP
1.1 首先在VS code上安装插件Cline ,然后安装MCP服务,连接doris。
1.2 在doris中建立ods表、dwd、dws和ads表。你也可以将所有表的字段写好,让cline去帮建表。 我的建立好了。总共13张表。

1.3 写个脚本生成数据,然后导入到doris中。
模拟数据脚本
python
import pymysql
import pandas as pd
import numpy as np
from faker import Faker
import random
from datetime import datetime, timedelta
# ==================== Doris 连接配置 ====================
DORIS_CONFIG = {
'host': '你自己的ip',
'port': 9030,
'user': 'root',
'password': '你root密码',
'database': 'gmall',
'charset': 'utf8mb4'
}
# ==================== 数据生成参数 ====================
NUM_USERS = 500
NUM_PRODUCTS = 200
NUM_ORDERS = 20000
NUM_DAYS = 30
START_DATE = datetime(2026, 7, 1)
def generate_data():
fake = Faker('zh_CN')
Faker.seed(42)
random.seed(42)
# 生成用户
users = []
for i in range(1, NUM_USERS + 1):
users.append({
'user_id': i,
'username': fake.user_name(),
'name': fake.name(),
'gender': random.choice(['M', 'F']),
'age': random.randint(18, 65),
'province': fake.province(),
'city': fake.city(),
'register_date': (START_DATE + timedelta(days=random.randint(0, NUM_DAYS))).date()
})
df_user = pd.DataFrame(users)
# 生成商品
categories = ['手机数码', '家用电器', '服装鞋帽', '食品饮料', '图书文具', '运动户外', '美妆护肤', '母婴用品']
products = []
for i in range(1, NUM_PRODUCTS + 1):
price = round(random.uniform(9.9, 999.9), 2)
products.append({
'product_id': i,
'product_name': fake.catch_phrase(),
'category': random.choice(categories),
'price': price,
'cost': round(price * random.uniform(0.4, 0.7), 2),
'stock': random.randint(10, 1000)
})
df_product = pd.DataFrame(products)
# 生成订单
order_status = ['待支付', '已支付', '已发货', '已完成']
orders = []
order_items = []
payments = []
order_id = 1
for _ in range(NUM_ORDERS):
user = random.choice(users)
order_date = START_DATE + timedelta(
days=random.randint(0, NUM_DAYS),
hours=random.randint(0, 23),
minutes=random.randint(0, 59)
)
status = random.choices(order_status, weights=[0.1, 0.2, 0.25, 0.45])[0]
num_items = random.randint(1, 5)
total_amount = 0
items = []
for _ in range(num_items):
product = random.choice(products)
qty = random.randint(1, 3)
amount = round(product['price'] * qty, 2)
total_amount += amount
items.append({
'order_id': order_id,
'product_id': product['product_id'],
'qty': qty,
'price': product['price'],
'amount': amount
})
orders.append({
'order_id': order_id,
'user_id': user['user_id'],
'order_date': order_date.strftime('%Y-%m-%d %H:%M:%S'),
'total_amount': round(total_amount, 2),
'status': status,
'pay_date': (order_date + timedelta(minutes=random.randint(5, 120))).strftime('%Y-%m-%d %H:%M:%S') if status in ['已支付', '已发货', '已完成'] else None,
'ship_date': (order_date + timedelta(hours=random.randint(2, 48))).strftime('%Y-%m-%d %H:%M:%S') if status in ['已发货', '已完成'] else None,
'finish_date': (order_date + timedelta(days=random.randint(3, 10))).strftime('%Y-%m-%d %H:%M:%S') if status == '已完成' else None
})
order_items.extend(items)
if status in ['已支付', '已发货', '已完成']:
payments.append({
'payment_id': order_id,
'order_id': order_id,
'user_id': user['user_id'],
'amount': round(total_amount, 2),
'pay_method': random.choice(['微信支付', '支付宝', '银行卡']),
'pay_time': (order_date + timedelta(minutes=random.randint(5, 120))).strftime('%Y-%m-%d %H:%M:%S')
})
order_id += 1
df_order = pd.DataFrame(orders)
df_order_item = pd.DataFrame(order_items)
df_payment = pd.DataFrame(payments)
# 将空字符串替换为 None(避免 MySQL 插入空字符串问题)
# 但我们的数据已经使用 None,无需处理
return df_user, df_product, df_order, df_order_item, df_payment
def insert_data(df, table_name, conn):
if df.empty:
return 0
# 将 DataFrame 转为 list of tuples,并将 NaN 替换为 None
data = df.replace({np.nan: None}).to_dict('records')
if not data:
return 0
columns = list(data[0].keys())
placeholders = ','.join(['%s'] * len(columns))
sql = f"INSERT INTO {table_name} ({','.join(columns)}) VALUES ({placeholders})"
cursor = conn.cursor()
# 构建 values 列表
values = []
for row in data:
values.append(tuple(row[col] for col in columns))
cursor.executemany(sql, values)
conn.commit()
cursor.close()
return len(values)
def main():
print("生成数据...")
df_user, df_product, df_order, df_order_item, df_payment = generate_data()
print(f"用户 {len(df_user)},商品 {len(df_product)},订单 {len(df_order)},明细 {len(df_order_item)},支付 {len(df_payment)}")
# 连接 Doris
conn = pymysql.connect(**DORIS_CONFIG)
print("开始导入数据...")
inserted = 0
inserted += insert_data(df_user, 'dim_user', conn)
inserted += insert_data(df_product, 'dim_product', conn)
inserted += insert_data(df_order, 'ods_order', conn)
inserted += insert_data(df_order_item, 'ods_order_item', conn)
inserted += insert_data(df_payment, 'ods_payment', conn)
conn.close()
print(f"✅ 成功插入 {inserted} 行数据到 Doris")
if __name__ == "__main__":
main()
导入之后可以稍微看一下,没什么大问题基本就ok。


二、基础数据准备好之后,我们接下来就是重点之重了。因为现在只有ods表和dim表有数据,我们要让AI先对我们源数据进行清洗,然后再让它们利用AI进行ETL写入到dwd表和dws表和ads表中。

上面是提示词,ads层写错了,不过没关系,AI会自动纠正。

它会将我的需求拆分成步骤,然后按照每一步来进行。

我们用AI,就是让它辅助我们生成代码,然后去监控排查我们的数据质量和BUG,或者分析错误日志,找到问题所在,大部分都是辅助作用。并不是让它去帮我们执行ETL代码哈。这个要分清楚,我们的代码始终还是在hadoop里面hive里面或者数据开发平台上去执行。就像这次的,我的ETL脚本是在doris执行的,它只是创建了脚本。

左边可以看到他的进度情况,右边可以看到它创建的脚本和数据质量的验证。

等一会后就结束了。我们来看一下结果怎么样。

烧了113.8KB的token,还行。目前我还没支付一分钱,还是0的状态(参照这张图的前一张,0.000。还可以继续苟着使用)
ads层:一张经营日报表,就最近三天的日报情况,总共32条数据。 另一张是商品的Top5排行榜,6000+条数据。
然后是左下角的那里,是它做了一些结果汇总工作,订单原表ods,2w+条数据,重复101条,去重之后差不多2w。订单明细的,6W条数据,重复456条。



它做的这个结果,数据到底准不准?我还没验证,我明天找个时间验证一下。今天就先到这吧。大家感兴趣的点个赞哈!
后面有时间再讲一讲关于数据治理的案例,这个也挺有意思的!