微软BI开拓者数据仓库专区ETCL设计 看看我的数据ETL,请多指点!

1  /  3  页   123 跳转 查看:16358

看看我的数据ETL,请多指点!

看看我的数据ETL,请多指点!

处理周期:1个小时
每次数据:10万

每个小时的第十分钟读取前一个小时数据。利用游标逐行数据处理,然后写入事实表。

我试过用SSIS处理数据,但是没弄明白,有些我需要的处理不能实现,我用脚本组件自己写的程序处理,发现太慢,不如游标快。

我不知道有什么好办法,老是觉得我的方法不对!

我没学过数据仓库,现在还一知半解。请大家指点一二。
 

回复:看看我的数据ETL,请多指点!

在取原始记录时,有没有时间标志,如果有,可以用between 批量处理吧!
中国数据库联盟 :http://cndba.5d6d.com
 

回复:看看我的数据ETL,请多指点!

把每小时的记录取到一个临时表中,然后再做ETL
中国数据库联盟 :http://cndba.5d6d.com
 

回复:看看我的数据ETL,请多指点!

我的处理方法是不是很低能?
 

回复: 看看我的数据ETL,请多指点!



引用:
原帖由 zhqian 于 2007-10-24 15:26:00 发表
把每小时的记录取到一个临时表中,然后再做ETL


和用游标有区别吗?  逐行处理不还是那些行吗
 

回复:看看我的数据ETL,请多指点!

从一个大的表中与从一个小的表中不一样的,还有,你做ETL的条件有什么,我认为一般情况可以不用游标,有些地方CASE就可以搞定的!
中国数据库联盟 :http://cndba.5d6d.com
 

回复:看看我的数据ETL,请多指点!

把用游标的代码发上来看下,专门这样谈,谈不到问题的点上的!
中国数据库联盟 :http://cndba.5d6d.com
 

回复:看看我的数据ETL,请多指点!

什么叫ETL的条件
我要处理出来的有:地区,叶面类型,来源站点,网站用户公司编号,网站目录,所属行业,当前页数,搜索引擎,小时等等
 

回复:看看我的数据ETL,请多指点!

DECLARE    @key_id bigint
DECLARE @site_id bigint            --站点编号
DECLARE    @user_id bigint --用户编号
DECLARE    @date_id  int--日期编号
DECLARE    @reftype_id int--来源类型
DECLARE    @refsite_id bigint
DECLARE    @hour_id int
DECLARE    @p_id bigint
DECLARE @pt_id int
DECLARE @ipno bigint
DECLARE @ad_id int
DECLARE @add_time datetime
DECLARE @from_id int
DECLARE @keyword_id bigint
DECLARE @fromSite bigint
DECLARE @join_url bigint
DECLARE @visit_no int
DECLARE @pages_no int
DECLARE @is_old int
DECLARE @is_cookie int
DECLARE @settle_no int
DECLARE @suserId int
DECLARE @isMoni int
DECLARE @address_id int
DECLARE @fatherId int

DECLARE @ly_guest int
DECLARE @ly_items int
DECLARE @ly_ad int
DECLARE @ly_type int
DECLARE @ly_appid int

DECLARE @ref_site varchar(50)
DECLARE @ref_name varchar(50)
DECLARE @ref_keyword varchar(200)
DECLARE @url_join varchar(500)

DECLARE    @is_true  bigint

DECLARE @vyear varchar(50)
DECLARE @vmonth varchar(50)
DECLARE @vday varchar(50)
DECLARE @vhour varchar(50)
DECLARE @hour varchar(50)

DECLARE @true_site int   
DECLARE @addsn int   


DECLARE @talkid bigint
DECLARE @Userid bigint

DECLARE @etl_date varchar(50)
DECLARE @etl_state int

DECLARE @will_etldate varchar(50)

    Set  @vyear = LTRIM(str(Year(getdate())))
    Set  @vmonth = LTRIM(str(Month(getdate())))
    Set  @vday = LTRIM(str(Day(getdate())))
    Set  @vhour = LTRIM(str(DATEPART (hour, getdate())))
    set @hour=@vyear+'-'+@vmonth+'-'+@vday+' '+@vhour+':00:00'

SELECT top 1 @etl_date=[etl_date],@etl_state=[etl_state]
FROM [Analytics_DB].[dbo].[ETL_Note]
where etl_type=8
order by etl_date desc

set @will_etldate =DATEADD(hour, 1, @etl_date)

if @etl_state=2 and DATEDIFF(hour, @will_etldate,@hour)>0 --上一次执行完毕 并且不是当前小时
begin
INSERT INTO [Analytics_DB].[dbo].[ETL_Note]
          ([etl_date],[etl_year],[etl_month],[etl_day],[etl_hour],[etl_state],etl_type)
    VALUES
          (DATEADD(hour, 1, @etl_date),LTRIM(str(Year(@will_etldate))),LTRIM(str(Month(@will_etldate))),LTRIM(str(Day(@will_etldate))),LTRIM(str(DATEPART (hour, @will_etldate))),1,8)
--定义游标
DECLARE Employee_OpenPV CURSOR FOR
SELECT [key_id],[site_id],[user_id],[ipno],[pt_id],[visit_no],[pages_no],[ref_type],[ref_site],
[ref_name],[ref_keyword],[url_join],[ad_id],[suser_id],[is_moni],[start_time],address_id,ly_guest,ly_items,ly_ad,ly_type,ly_appid,father_id
FROM [Analytics_DB].[dbo].[OpenPV] with (nolock)
where DATEDIFF(day, start_time,@will_etldate)=0 and DATEPART(hour, start_time)=DATEPART (hour, @will_etldate) and is_moni=0 and pt_id<>2
OPEN Employee_OpenPV

FETCH NEXT FROM Employee_OpenPV
INTO @key_id,@site_id,@user_id,@ipno,@pt_id,@visit_no,@pages_no,@reftype_id,@ref_site,@ref_name,@ref_keyword,@url_join,
@ad_id,@suserId,@isMoni,@add_time,@address_id,@ly_guest,@ly_items,@ly_ad,@ly_type,@ly_appid,@fatherId
WHILE @@FETCH_STATUS = 0
BEGIN
--检查站点编号
SELECT @true_site=count(*) FROM [Analytics_DW].[dbo].[Stat_Site] where site_id=@site_id
If @true_site=0
Begin
INSERT INTO [Analytics_DW].[dbo].[Error_PV]
          ([key_id],[site_id],[user_id],[ipno],[pt_id],[visit_no],[pages_no],[ref_type],[ref_site],[ref_name]
          ,[ref_keyword],[url_join],[ad_id],[suser_id],[is_moni],[add_time],[address_id],[ly_guest],[ly_items],[ly_ad]
          ,[ly_type],[ly_appid])
    VALUES(@key_id,@site_id,@user_id,@ipno,@pt_id,@visit_no,@pages_no,@reftype_id,@ref_site,@ref_name,@ref_keyword,@url_join,
@ad_id,@suserId,@isMoni,@add_time,@address_id,@ly_guest,@ly_items,@ly_ad,@ly_type,@ly_appid)
End
Else
Begin
    Set  @vyear = LTRIM(str(Year(@add_time)))
    Set  @vmonth = LTRIM(str(Month(@add_time)))
    Set  @vday = LTRIM(str(Day(@add_time)))
    Set  @vhour = LTRIM(str(DATEPART (hour, @add_time)))
    set @hour=@vyear+'-'+@vmonth+'-'+@vday+' '+@vhour+':00:00'
    --处理小时编号
    set @hour_id=@vhour
    if @fatherId is null
    set @fatherId=8

    --处理日期编号
    SELECT top 1 @date_id=[date_id] FROM [Analytics_DW].[dbo].[Stat_Date] where d_year=@vyear and d_month=@vmonth and d_day=@vday
        if @date_id is null
            set @date_id=1
    if @isMoni=1
    begin
    set @p_id=1
    set @refsite_id=1
    set @from_id=1
    set @keyword_id=1
        INSERT INTO [All_OpenPV]
                       (key_id,[talk_id],[site_id],[user_id],[ip_no],[date_id],[hour_id],[reftype_id],
                        [refsite_id],from_id,keyword_id,[p_id],[pt_id],[ad_id],[suser_id],[is_moni],add_time,address_id,ly_guest,ly_items,ly_ad,ly_type,ly_appid,father_id)
                 VALUES
                       (@key_id,0,@site_id,@user_id,@ipno,@date_id,@hour_id,@reftype_id,@refsite_id,@from_id,@keyword_id,@p_id
                       ,@pt_id,@ad_id,@suserId,@isMoni,@hour,@address_id,@ly_guest,@ly_items,@ly_ad,@ly_type,@ly_appid,@fatherId)
    end
    else
    begin
        --处理页面编号
        set @p_id=1
        SELECT top 1 @p_id=[p_id] FROM [Analytics_DW].[dbo].[Stat_LyPage] where p_name=@url_join  and site_id=@site_id
            if @p_id is null
                set @p_id=1
         --处理来路站点编号
        set @refsite_id=1
        SELECT top 1 @refsite_id=[refsite_id] FROM [Analytics_DW].[dbo].[RefSite] where refsite_name=@ref_site  and site_id=@site_id
        if @refsite_id is null
                set @refsite_id=1

        --处理搜索引擎
        if @ref_keyword is null or @ref_keyword=''
        begin
            set @from_id=1
            set @keyword_id=1
        end
        else
        begin
        set @from_id=1   
        SELECT top 1 @from_id=[from_id] FROM [Analytics_DW].[dbo].[Stat_FromWeb] where from_name=@ref_name
        if @from_id is null
                set @from_id=1   
        end
        set @keyword_id=1
        --处理来自广告转换 搜索引擎 关键词转换
        if @pt_id=1 or @pt_id=2
        begin
            if @keyword_id=1 and @ad_id=1
                begin
                    select top 1 @ad_id=ad_id,@fatherId=father_id from [Analytics_DB].[dbo].[OpenPV] with(nolock)
                        where is_moni=1 and ipno=@ipno and add_time > DATEADD(day, -1, @add_time) order by key_id desc
                    if @ad_id<>1
                    begin
                        set @from_id=1
                        set @keyword_id=1
                    end
                    else
                    begin
                    set @ref_name=null
                    select top 1  @ref_name=ref_name from [Analytics_DB].[dbo].[OpenPV] with(nolock)
                        where is_moni=0 and ipno=@ipno and add_time > DATEADD(day, -1, @add_time) order by key_id desc
                    set @from_id=1   
                    SELECT top 1 @from_id=[from_id] FROM [Analytics_DW].[dbo].[Stat_FromWeb] where from_name=@ref_name
                    if @from_id is null
                        set @from_id=1
                    end
                end
        end

        --处理留言站点编号
        set @is_true=null
        if @pt_id=2 and @ref_site<>'9.txooo.com'
        begin
         SELECT top 1 @is_true=site_id FROM [Analytics_DW].[dbo].[Stat_Site] with(nolock) where siteurl=@ref_site
            if @is_true is not null
                set @site_id=@is_true
        end

    --写入PV
    INSERT INTO [All_OpenPV]
                   (key_id,[talk_id],[site_id],[user_id],[ip_no],[date_id],[hour_id],[reftype_id],
                    [refsite_id],from_id,keyword_id,[p_id],[pt_id],[ad_id],[suser_id],[is_moni],add_time,address_id,ly_guest,ly_items,ly_ad,ly_type,ly_appid,father_id)
             VALUES
                   (@key_id,0,@site_id,@user_id,@ipno,@date_id,@hour_id,@reftype_id,@refsite_id,@from_id,@keyword_id,@p_id
                   ,@pt_id,@ad_id,@suserId,@isMoni,@hour,@address_id,@ly_guest,@ly_items,@ly_ad,@ly_type,@ly_appid,@fatherId)

End
end

    --break
    --获取下一条
    FETCH NEXT FROM Employee_OpenPV
    INTO @key_id,@site_id,@user_id,@ipno,@pt_id,@visit_no,@pages_no,@reftype_id,@ref_site,@ref_name,@ref_keyword,@url_join,
@ad_id,@suserId,@isMoni,@add_time,@address_id,@ly_guest,@ly_items,@ly_ad,@ly_type,@ly_appid,@fatherId
END

--关闭游标
CLOSE Employee_OpenPV
DEALLOCATE Employee_OpenPV
--执行完毕
UPDATE [Analytics_DB].[dbo].[ETL_Note]
  SET [etl_state] = 2,[endtime] = getdate()
WHERE etl_date=@will_etldate and etl_type=8
end
 

回复:看看我的数据ETL,请多指点!

可以用seelct filed into #tmptable from tABLE 的方式来把各种数据分成每个类,再对每一个类用SQL代码处理,我想会快些吧,我是外行人!
在有些地方处理可以用case 语句来分类!
中国数据库联盟 :http://cndba.5d6d.com
 
1  /  3  页   123 跳转

版权所有 微软BI开拓者 

Powered by Discuz!NT 2.1.202    Copyright © 2001-2012 Comsenz Inc.
Processed in 0.3281313 second(s) , 0 query.
返顶部