记一次关于AI在数仓中的应用

一、工具: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条。

它做的这个结果,数据到底准不准?我还没验证,我明天找个时间验证一下。今天就先到这吧。大家感兴趣的点个赞哈!

后面有时间再讲一讲关于数据治理的案例,这个也挺有意思的!

相关推荐
tachibana21 小时前
性能指标的口径选择
数据库·人工智能·架构·大模型·llm
HIT_Weston1 小时前
183、【Agent】【OpenCode】TuiThreadCmd(JS&TS 历史)
人工智能·agent·opencode
longxiaozhang61 小时前
C#运算符重载:让对象也能使用“加减乘除”
开发语言·c#
蓝狐社1 小时前
你的软件越来越卡,是因为它多了个AI
人工智能
万悉科技1 小时前
AI时代的“搜索战争“变了:从关键词排名到意图匹配,品牌正在大模型的注意力机制里“失声“
人工智能
W_326002 小时前
Python-OpenCV HSV颜色空间与inRange颜色分割:按颜色提取目标物体
图像处理·人工智能·python·opencv·机器学习
小小测试开发2 小时前
Agent 安全测试:pytest 原生红队框架 RAMPART 实战解析
人工智能·pytest
FunTester2 小时前
DeepSeek Harness 常用插件介绍
人工智能·语言模型·常用插件·deepseek·harness
九硕智慧建筑一体化厂家2 小时前
楼宇自控|智慧建筑核心引擎!楼宇自控系统,赋能建筑高效低碳运维
运维·人工智能·笔记·智慧城市
byte轻骑兵2 小时前
【BlueZ 】蓝牙 SDAP 协议入门:BlueZ 中设备服务发现的基础逻辑
linux·人工智能·bluez·电脑蓝牙·嵌入式蓝牙