msgbartop
List for SAS fans and programmer
msgbarbottom

01 7月 17 何种方式最有效地得到数据表的观测数?


何种方式最有效地得到数据表的观测数?
reproduced by sxlion

导读:SASor论坛上经典对话很多,以前用爬虫把整个网站down下来过一次,可惜没时间整理,然后电脑升级,最后就丢失了。每每想重温论坛,都无法得到原文。网络上仅仅转载了部分的对话,想起来真是可惜。现在仅凭一些时有时无的记忆点,在网络重搜出来一些经典对话,整理分享一下【论坛沉钩001】。

QKAIWEI:
1

1
2
3
%let rc=%sysfunc(open(yourTable));
%let nobs=%sysfunc(attrn(&rc,nobs));
%let rc=%sysfunc(close(&rc));

2

1
2
3
proc sql noprint;
select count(1) into:nobs from yourTable;
quit;

3

1
2
3
4
5
6
data _null_;
point=0;
set yourTable point=point nobs=n;
call symput('nobs',n);
stop;
run;

4

others???

SAS_DREAM:

1

1
2
3
%let rc=%sysfunc(open(yourTable));
%let nobs=%sysfunc(attrn(&rc,nobs));
%let rc=%sysfunc(close(&rc));

– open, attrn是SCL函数在base里的调用方式,需要测试一下对AF license的依赖性,该方法从表头meta区读取信息,与数据大小无关,效率较高。不过attrn要建立scl list,稍费周折。

2

1
2
3
proc sql noprint;
select count(1) into:nobs from yourTable;
quit;

– 顺序遍历表,数数记录,不从表头取信息,表越大,时间越长。

3

1
2
3
4
5
6
data _null_;
point=0;
set yourTable point=point nobs=n;
call symput('nobs',n);
stop;
run;

– 考虑一下空表情形:

1
2
3
4
5
6
%let nobs = 0;
data _null_;
set yourTable (drop=_all_) nobs=n;
call symput('nobs',n);
stop;
run;

如果空表,n是取不到值的,所以宏obs要赋初值。
(drop=_all_)当表列数很多又是通过远程提交时,这个选项会省时间。
point=0不用也可,因为stop会限制data step在一条记录以后就停。

这个方法也是直接从表头meta区取观测数,与表大小无关。

4 others???
你已经知道这么多方法,除了第二条没有什么理由去用,第一,三方法都是既简洁准确又不用一秒钟就精确搞定,余下的时间,不如去想其它有意思的专题了。

IMOEN:

1
2
3
4
5
PROC SQL NOPRINT;
SELECT NOBS INTO: NUM_OF_ROW
FROM SASHELP.VTABLE
WHERE LIBNAME="SASHELP" AND MEMNAME="CLASS";
QUIT;%PUT &NUM_OF_ROW;

这种方法也是直读metadata,优点是不仅仅可以用来读出纪录数,还可读出大量有用的表信息。打开sashelp.vtable看一看就知道了。

SAS_DREAM:

imoen 写到:
1
2
3
4
5
PROC SQL NOPRINT;
SELECT NOBS INTO: NUM_OF_ROW
FROM SASHELP.VTABLE
WHERE LIBNAME="SASHELP" AND MEMNAME="CLASS";
QUIT;%PUT &NUM_OF_ROW;

这种方法也是直读metadata,优点是不仅仅可以用来读出纪录数,还可读出大量有用的表信息。打开sashelp.vtable看一看就知道了。

透过vtable这样一个集中元数据表来访问表信息,对于一次性访问多个表的多种信息,是很方便的。

但是就每次零星地考察单表记录数而言,有些地方似乎值得进一步考量:
sashelp.vtable是sashelp库里的一个sql view, 应该是有后台管理进程辅助更新。对于通过vtable访问某个表的记录数,可能有几个担心:
1,在vtable中搜寻一个单表的信息需要进行View的retrieve遍历,还要进行逐条比对(WHERE LIBNAME=”SASHELP” AND MEMNAME=”CLASS”);尚不清楚vtable view的生成代码是什么(感觉像是Proc contents类似的操作生成的),但是该view的建立应该很难高效地利用针对“libname”和”memname”的索引,这样,搜寻访问效率可能随着view retrieve遍历的表记录增加而降低。
当系统中总的表数增大到一个较大的数量级,这在大型数据仓库系统,尤其是系统安装的模块较多,或者存在大量OLAP, EM projects时很有可能发生,vtable中包含的内容就会很多,因为它的内容涵盖系统中所有的表,甚至临时表;此时如果又用不上索引,vtable的访问速度会相当慢,事实上,用VT sashelp.vtable时已会有所感觉。
2,对于服务器端的应用,如果多个连接程序需要同时访问vtable取信息时,可能会进一步面临效率问题
3,当服务器端系统中一方面不断生成和删除大量表,同时有很多远程连接需要访问vtable取信息时,vtable所透视的内容可能面临更新和取用的双重压力

不过对于一般应用情形,都是OK了。 上面的担心只是瞎猜而已… …

IMOEN:

View只在被访问时才生成数据。同时,SAS的串行查询,令到冲突几乎不可能发生。

由于都是访问metadata,即使系统中有数千个表,也是秒级的操作。在大数据量ETL优化时,这类秒级操作基本上是忽略的。程序的可读性和通用性更加重要。

在主流DBMS中,SQL优化器在遇到qkaiwei第二种方法时,都会直接查询meta,而不是遍历原数据。如果数据引擎用的是其他DBMS,最快的方法是用SQL Pass-through。例如:

1
2
3
4
5
6
Proc SQL;
CONNECT TO ODBC AS DW ();SELECT nob INTO :NO_OF_ROW
FROM CONNECTION TO DW
(SELECT count(*) AS nob
FROM a_table);DISCONNECT FROM DW;
QUIT;

如果在SAS里面Count(*),立刻就会把所有的数据,通过你的接口引擎,在SAS中遍历。两种方法的速度有本质的差别。

SAS_DREAM:

imoen 写到:
在主流DBMS中,SQL优化器在遇到qkaiwei第二种方法时,都会直接查询meta,而不是遍历原数据。如果数据引擎用的是其他DBMS,最快的方法是用SQL Pass-through。例如:

1
2
3
4
5
6
Proc SQL;
CONNECT TO ODBC AS DW ();SELECT nob INTO :NO_OF_ROW
FROM CONNECTION TO DW
(SELECT count(*) AS nob
FROM a_table);DISCONNECT FROM DW;
QUIT;


如果在SAS里面Count(*),立刻就会把所有的数据,通过你的接口引擎,在SAS中遍历。两种方法的速度有本质的差别。

说得有道理!

感谢Q版,大清早信手拈来就给大家一个好玩的话题!
今天和vtable玩了个游戏,发现一些现象很有趣:

1,先造10000个表在系统里

1
2
3
4
5
6
7
8
9
10
11
12
13
%let tableNum = 10000;

%macro tables();
data
%do i=1 %to &tableNum;
test&i
%end;
;
set sashelp.class;
run;
%mend tables;

%tables;

2,再去找其中TEST100的观测数
set nobs跑了1秒

1
2
3
4
5
6
7
8
9
%let nobs=0;

data _null_;
set TEST100(drop=_all_) nobs=rows;
call symput('nobs',rows);
stop;
run;

%put &nobs;

NOTE: There were 1 observations read from the data set WORK.TEST100.
NOTE: DATA statement used:
real time 1.00 seconds
cpu time 0.00 seconds

FROM SASHELP.VTABLE跑了29秒

1
2
3
4
5
PROC SQL;
SELECT NOBS
FROM SASHELP.VTABLE
WHERE LIBNAME="WORK" AND MEMNAME="TEST100";
QUIT;

NOTE: PROCEDURE SQL used:
real time 29.10 seconds
cpu time 0.17 seconds

如果再运行一遍,由于cache的机理,两个方法都是不到1秒了。

猜想:
vtable被访问时的应该是动态收集系统中所有的表meta,搜集的耗时与表的数目有关,而且不论是访问那个表的信息(where 。。。),都是先去收集系统中所有的表meta;否则,利用WHERE LIBNAME=”WORK” AND MEMNAME=”TEST100″取一条记录,不会在系统表数目增长时产生显著的响应下降(系统表1000个时,就是2,3秒而已)
而set nobs的方法与系统表数目无关。
因此,极端情况下vtable还是有响应效率问题的,不过算不了什么。

结论:
1万个系统表的状况还是比较罕见的,而且vtable的响应也是可以接受(机器快了更是影响比较小),如Imoen所说,使用vtable方法比较通用和易读,也不致在效率上产生实质问题。
只取观测数的话,set nobs方法仍是比较高效的。
如果愿意,编个macro把set nobs和vtable的优势结合,也是很好玩的。

提示:
这个测试情形必须保证消除cache效应,方法可以是在每种方法测试之前,运行一个大进大出的summary,搞到out of memory更好,会把之前测试的cache清得一干二净,各种方法的真实效率才会显现,在其它类似测试中也如是。

QKAIWEI:
我其实一直想努力使sasor向这个方向走:画一个圈,挖一口井。

我一般使用data步的做法,比较省时,而且sas语言上data步是最稳定的,如果用别的,说不定哪里就来个bug。

如果是在scl中,我一般用
dsid=open(talbename);
nobs=attrn(dsid,’nobs’);

接下来,我可能要前移游标,做变量取值操作。但是scl语法不能操作sas server上的表,使用%sysfunc一般也是折衷之计。

在远程sas server如果想得到scl的同样效果,我的做法是

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
rsubmit;
%let rc=%sysfunc(open(tablename));
%let nobs=%sysfunc(attrn(&rc,nobs));
%let rc=%sysfunc(close(&rc));

data _null_;
nobs=&nobs;
do p=1 to nobs
set my table point=p;
call symput('a',a);
call symput('b',b);
call execute('%macro1(&a)');
call execute('%macro2(&b)');
end;
stop;run;
endrsubmit;

proc sql在使用v系列的视图确实相比其他方法比较耗费时间,当然这个差别要考虑机器性能。
我以前的电脑在使用这一方法的时候总要顿一下。
当然imoen的说的也是,就是在读取其他数据库的时候,如oracle上的表时,这是scl 以及data步不能实现的。

在sas server上分组取观测数时,proc sql也很有意思,有的时候也用一下,比较方便。

1
2
3
4
5
6
rsubmit;
proc sql noprint;
select count(1) into:group_obs separated by ',' from tblname group by var;
quit;
&sysrput group_obs=&group_obs /*caution the length of macro variable*/
endrsubmit;

接下来有个%superq的用法,然后循环,用%scan分别取值。
我去做饭,不能多写了,希望多开一些这样的题目,做深入的讨论。
两位周末快乐!

原创文章: ”何种方式最有效地得到数据表的观测数?“,转载请注明: 转自SAS资源资讯列表

本文链接地址: http://saslist.net/archives/448


17 1月 12 SAS资源资讯博客精华汇总 2011

2011年网站年末盘点

2012农历新年马上就要到了,看着湖南卫视的小年夜春晚,不禁想着给自己的博客网站做个盘点,这个想法其实在大家年会的时候就想做了,趁奥尼尔还没出场,赶紧把这个盘点给整了,有些事现在不做,以后永远就不会做了。

 自从2010年9月3日开始至今天(2012.1.17),本博客网站共发布了60篇博文,其中2010年16篇,2011年42篇,2012年是2篇,累计访问IP近2W,PV近10W(因为用插件统计,所以有一定的水分,需要打折下)。因为没有类似的博客网站数据和其他类型网站的数据(都没有公布),所以无法横向和纵向比较。大家也随便看看,消遣一下吧,反正有水分。

本站文章包括自己原创评论、网络资源整理、工作信息、书籍点评推荐、转载文章和外文翻译等等内容,下面对本站博文的内容分类和精选才是最真才实料的干货。

史上最强悍的十篇SAS资源整理博文

  1. 最全的SAS9.2函数列表一
  2. 2010年10月近期SAS职位招聘列表
  3. SAS中文书籍清单 1991-2010年
  4. 学习和提高SAS编程和应用的好出处——博客资源(2011年扩充版)
  5. 学习SAS编程技术的好出处——网页资源
  6. 学习和讨论SAS技术的好出处——论坛资源
  7. 学习SAS画图的好出处
  8. SAS程序员必看的10个中文网站(另10个英文)
  9. 最新最全的SAS公司官方博客(2011年)
  10. 新浪微博资讯整理列表

(更多…)

29 9月 11 SAS程序员必看的10个中文网站(另10个英文)


据个人多年的SAS学习经历,下面推荐10个SAS程序员必看的中文网站:

1,Google.hk                 强悍的技术搜素引擎       http://www.google.com.hk/

2,SAS资源资讯列表      SAS综合信息博客           http://saslist.net/

3,SAS中文论坛            人气SAS论坛                  http://mysas.net/forum

4,人大经济论坛 SAS版   人气SAS论坛                http://bbs.pinggu.org/forum-68-1.html

5, (更多…)

原创文章: ”SAS程序员必看的10个中文网站(另10个英文)“,转载请注明: 转自SAS资源资讯列表

本文链接地址: http://saslist.net/archives/204


29 8月 11 最新最全的SAS公司官方博客(2011年)


博客作为一种很好的信息传播媒体,SAS公司前几年开始尝试一些博客信息公布,刚开始只有个别员工,后来很多部门也开始建立机构的团队博客。

随着SAS新版本9.3的问世,SAS公司更改了原来SAS博客地址,原来为:http://blogs.sas.com,现在更改为:http://blogs.sas.com/content/ 。订阅过这些博客的TX们,赶紧更改feed的地址啊,老地址的博文将不再更新了。

这些都来自SAS公司内部人员,可以说是第一手信息,新鲜又权威,就是有点多,SAS粉们可以对感兴趣的选择性关注下。

下面是SAS公司的博客列表:

(更多…)

原创文章: ”最新最全的SAS公司官方博客(2011年)“,转载请注明: 转自SAS资源资讯列表

本文链接地址: http://saslist.net/archives/181


13 8月 11 公益活动: SAS(统计分析软件)维基计划


前言:

如果说论坛BBS是一群人的讨论会,那么博客Blog是一个人的独角戏,而维基Wiki则是一群人共同编写一部大辞典。

维基作为一项公益性的共享项目, “平等”、“开放”、“协作”、“共享”是维基精神的核心理念。维基百科全书的创始人Jimmy Wales当初创建维基百科的初衷是建立一个网上的百科全书(中文版本),而事实上图书馆中已经有大英百科全书。尽管如此,维基百科全书经过8年的发展,英文版就含有280万篇文章,是大英百科全书的5倍多。因为把百科全书搬到网络上,大家可以更加方便的使用,百科本身也可以在大家都维护下不断更新,保持时新性。

正文:

创建SAS维基的目的是建立一个专注于统计分析软件的词典,因为图书馆并没有一本统计软件的百科全书,维基百科全书上只是简单的介绍见:统计软件,显然并不能满足专业化的细节需求。维基百科全书本身就是一种实用的工具,然后大百科的分类目录太长,不方便扩展和精细化的操作,因此有必要适当的建立专业而全面的统计软件小百科。

下面是SAS维基的首页面截图:

(更多…)

原创文章: ”公益活动: SAS(统计分析软件)维基计划“,转载请注明: 转自SAS资源资讯列表

本文链接地址: http://saslist.net/archives/166


27 4月 11 学习SAS画图的好出处


这里的SAS画图是指用SAS编程代码的方式来作图。

虽然用SAS作图很辛苦,但是有时为了保持系统性和自动化,不得不用SAS来作图。当然,SAS作图并非儿戏,它也能做出非常专业精美的图形

下面介绍几个EXCEL作图和SAS画图相关的资源。

之所以学习EXCEL,是为了入门,因为作图设计到颜色搭配、图表类型选择、表达形式和风格,以及怎么匹配不同的场合等等很多问题,本身就是门专业技术活;然后就是怎么将这些图用SAS代码来实现了。

(更多…)

原创文章: ”学习SAS画图的好出处“,转载请注明: 转自SAS资源资讯列表

本文链接地址: http://saslist.net/archives/124


03 4月 11 学习和提高SAS编程和应用的好出处——博客资源(2011年扩充版)


本博去年(2010年)9月6日收集了几个有关SAS编程和应用的博客,这里进行扩充,并且增加了微博这种新的博客形式。

博客和微博都是以一种个人发布的形式传播信息。博客传递非常快和信息大;微博则是短和更快。

传统书籍和网页都跟不上步伐,因此这里倾力收集了目前主要是中文或华人的SAS博客,以后会逐渐增加更多英文博客和更全面的相关博客,不断更新, 希望能够满足大家的需求。 (更多…)

原创文章: ”学习和提高SAS编程和应用的好出处——博客资源(2011年扩充版)“,转载请注明: 转自SAS资源资讯列表

本文链接地址: http://saslist.net/archives/119


07 10月 10 七个SAS公司员工博客


尽管目前大型博客站点纷纷倒闭,但是博客这种非常个性化的形式,不会过时,还是非常适合技术人员来分享技术。我觉得很多大型综合性的博客站不容易个性化,不好定位而导致关门,而个人博客如果定位某一门技术,也许受众很小,但也是能提高所在行业知名度的。当然写博客是件辛苦的事情,大部分都是义务劳动,汗水换荣誉。不过这次推出的是有公司给博主付费的博客,那就是SAS公司。                http:// saslist.net

SAS公司博客最近新增了两位员工博客,一个是关于IML主题,一个是关于JMP主题。毫无疑问,他们是日常工作就是与这些内容打交道,通俗点,他们就是专门干这个的,当然他们的技术博客也值得订阅学习,也可以在博客留言问问题交流,提供技术支持本来就是他们的工作一部分。下面除了给出新开了两个博客,我另外挑选了5个技术性非常强的博客,一个7个,如下:                             http://saslist.net

Rick Wicklin 新开博客

IML模块/studio开发者  Statistical Programming with SAS/IML Software 作者  http://blogs.sas.com/iml/

JMP 新开博客
有关JMP软件 数据展现、six sigma、实验设计及统计            http://blogs.sas.com/jmp/
负责support.sas.com更新                        http://blogs.sas.com/supportnews/
内容为Enterprise Guide, 微软办公 Add-In 和EM. SAS for Dummies作者 http://blogs.sas.com/sasdummy/
SAS用户全球论坛  http://blogs.sas.com/sgf/
SAS培训、认证,一些技巧建议 http://blogs.sas.com/sastraining/
文本挖掘,非结构性文本 团体博客 http://blogs.sas.com/text-mining/
————————————————
SAS公司陆续推出员工博客,值得我们关注。

原创文章: ”七个SAS公司员工博客“,转载请注明: 转自SAS资源资讯列表

本文链接地址: http://saslist.net/archives/88


06 9月 10 学习和提高SAS编程和应用的好出处——博客资源


博客资源 (随机排序)

我所订阅到SAS博客

http://blogs.sas.com/sasdummy/ SAS公司员工博客

主要是将EG模块的。博客作者曾经写过一本初级的SAS书《SAS for Dummies

http://sxlion.spaces.live.com/default.aspx 一个SASor的技术空间

一个SAS爱好者用SAS编程解决各种数据清理,数据整理和解决各种实际问题。

http://sxlion.blog.sohu.com/ 一个SASor的图表空间

和上面是同一个作者,这个博客宣称用SAS画出所能看到的所有数据图形,主要侧重于商业,学术和工业图表,里面有用SAS模仿商业周刊风格的精美图表。

http://sas-programming.blogspot.com SAS Programming for Data Mining Applications

oloolo的个人技术博客,专注于用BASE,STAT等等编程模块实现与EM同等功能的各种数据挖掘功能的算法,相当强大,SAS主办的2010年数据挖掘大会上作为官方推荐资源。博客提供了许多用BASE编的挖掘算法, 可惜国内看不到,需翻墙。

http://sugiclub.blogspot.com/ SUGI CLUB — SAS User Group International Club

这个博客,文章是博主挑出各SUG(SAS用户组,在网页资源有解释)的一些文章进行翻译,做少量补充,内容涉及范围较广。但是需要翻墙。

下面是几个停止更新的博客:

http://statcompute.spaces.live.com/default.aspx

博主刘文穗 WenSui Liu,现在在ebay。 曾经是最勤劳的SAS博主,产量非常大,博客文章很值得一读,都是关于市场,经济等等方面的。2010年5月后停止更新。

http://blog.csdn.net/anyjack/

博主单名一个:风    各种SAS技术,偏IT,2009年停止更新。

原创文章: ”学习和提高SAS编程和应用的好出处——博客资源“,转载请注明: 转自SAS资源资讯列表

本文链接地址: http://saslist.net/archives/59


04 9月 10 学习SAS编程技术的好出处——网页资源


WWW网页

1, 很真诚地说,SAS自带的help帮助是最好的学SAS的资料,通常来说每个版本的SAS帮助有两种形式,一种就是随SAS软件安装一起存在于被安装电脑中的.chm格式文件;还有一种就是在SAS公司网站在线的帮助文件,提供pdf格式下载和html格式的阅读。

地址在:http://support.sas.com/documentation/

上面两种形式的帮助文件存在一定的差别,主要在1,online的帮助会经常更新,一些新的模块里面常常出现小错误(比如代码等)。有时你会发现自带的帮助里面的代码有时候运行出错,去网站找到同样问题的代码,你会发现运行很好,原因就是online可以实时更新。2,online版帮助可谓是号称史上最全的SAS帮助文档,22个开头字母一字排开,很有气场,里面有的模块也许一辈子也不会接触。相比而言,随机的chm文件只提供和安装介质相应的help文档。当然随机的chm文件还是有些优点的,比如查找问题起来很方便,速度快,还无需上网。个人认为大多数人还是倾向用随机的help,优点有二:一个是够用,一个是够快。

2,http://support.sas.com/notes/index.html

SAS公司提供一些编程小技巧,以前在support.sas.com/sassamples/quicktips/(已失效)里面,现在已经更新了。 上面经常会有一些实用的小代码出现,特别是一些新模块的代码举例。

3,http://support.sas.com/documentation/onlinedoc/code.samples.html

大家都知道,SAS公司出版的书籍非常昂贵,全是美金做单位,还不打折。但是与书对应的代码却是免费的。如果你想学习SAS的某个内容或者感觉自己学习SAS没有进展,那就到这里来读SAS代码吧,全部免费,可以下载打印出来慢慢品味。

4,http://www.lexjansen.com/

世界各地有个叫SAS  users group (SUG)的组织,不能的地方的SUG就加个代表该地区的缩写以示区别,比如说美国的一些SUG及简称:Southeast SAS Users Group (SESUG),MidWest SAS Users Group (MWSUG) ,Western Users of SAS Software (WUSS),South Central SAS Users Group (SCSUG) ,NorthEast SAS Users Group (NESUG)。 这些组织不是组织SAS程序员看电影,旅游参观等等活动,他们是组织当地的SAS程序员交流SAS使用经验,每次会议都有大量的论文投稿,其中不乏高质量的代码和应用论文,并且几乎所有论文都可以从上面提供的地址下载到。这些论文往往是SAS程序员在实际应用SAS经验的总结,并且各种难度级别和应用领域的文章都用,非常值得一看,特别是对于SAS高级技术进阶人员来说。随便说一下,在SAS公司的全球usergroup的列表里面只有日本,韩国,新加坡,其中日本从00年开始都连续搞了10年了。

5,http://saslist.net/

以上资源都是免费的,几乎包括一切你需要学习和能够用到的。但是你会发现为什么没有中文的,全是英文的。本博就是为发布最新的最全面的中文资源资讯而建立的。

原创文章: ”学习SAS编程技术的好出处——网页资源“,转载请注明: 转自SAS资源资讯列表

本文链接地址: http://saslist.net/archives/41