记一次关于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条。

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

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

相关推荐
m0_5873830020 小时前
折扣卡CPS系统源码的技术架构与实战开发指南
人工智能·小程序·数据挖掘·系统架构·需求分析
资讯综合20 小时前
河北被动防护网厂家哪家强 5个选型标准帮你选
人工智能
troy12820 小时前
分布式系统框架选型指南:主流框架优缺点深度对比
python·django·pygame
学Linux的语莫20 小时前
LangChain Prompts 提示词模板
数据库·人工智能·langchain
PC2005-cloud20 小时前
DSH 白嫖指南:接入 Command Code Go、WorkBuddy 与 Trae 的免费额度
开发语言·后端·golang
敲代码的嘎仔20 小时前
从集群锁失效到异步领券:我用分布式锁 + Redisson + MQ 把领券接口 RT 从 200ms 压到 15ms
java·数据库·redis·分布式·缓存·ai·wpf
知几蜗牛20 小时前
Agent到底比一次大模型调用多了什么?小白从这张流程图看懂
人工智能
张彦峰ZYF20 小时前
Prefactor 从“看见 Agent”到“拦住 Agent”:实时评估如何重构 AI Agent 的生产可靠性
人工智能·llm·ai agent·evaluate·llm-as-a-judge·prefactor·金融agent
知几蜗牛20 小时前
语音AI开始边听边说,改变的不只是响应速度
人工智能
129Lab20 小时前
BMS算法快速原型开发:AI辅助实现扩展卡尔曼滤波(EKF)SOC估算从理论到代码落地
python·嵌入式开发·bms·卡尔曼滤波·电池管理系统·soc估算