2017年11月8日水曜日

DATAステップビューの作成




前回「SQLビューの作成と落とし穴①」を書いたので、似たような機能のDATAステップビューにも触れておきます。



以下をご覧ください

data DSVIEW / view=DSVIEW;
   set SASHELP.CLASS;
   keep NAME AGE;
run;

proc print data=DSVIEW noobs;
run;


上で作成した DSVIEW は一見データセットに見えますが、「DATAステップビュー」というものです。
「DATAステップビュー」には、データセットではなく以下が保存されます。
  • コンパイルしたDATAステップのプログラム
  • 変数の型やLENGTHといった属性情報

このDATAステップビューを開いたり、参照すると、コンパイルしたプログラムが実行されて結果のデータが返ってくる仕組みになっています。


構文

   DATA  ビュー名 / VIEW = ビュー名;
      ~ プログラム ~
   RUN;



ビューの定義を見たい場合は以下のように書きます。

data view=DSVIEW;
   describe;
run;

ログ
NOTE: DATAステップビューWORK.DSVIEWの定義:

data DSVIEW / view=DSVIEW;
   set SASHELP.CLASS;
   keep NAME AGE;
run;




DATAステップビューのメリット


たとえば、DT1というデータセットがあっとして、
以下のようにDT1から変数Cを導出するDATAステップビューを作っておいたとします。

data MYLIB.STAT1 / view=MYLIB.STAT1;
   set DT1;
   C = A + B;
run;


この変数Cに対して、MEANSプロシジャを実行したとします。

proc means data=MYLIB.STAT1;
   var C;
run;


ここでもし、DT1の中身が定期的に更新されて、更新される度に変数Cに対してMEANSを実行しなおしたい場合、、
最初に「変数Cを作るDATAステップビュー」を作ってライブラリに保存しておいたので、
たとえDT1が更新されても、DATAステップビューを参照するMEANSを実行するだけで済みます。

(ビューを参照するだけで、内部で最新のDT1に対してビューに保存されたデータステップのプログラムが実行され、その結果に対してMEANSが実行されるため。)



またメリットとして、ビューの中身は定義なのでファイルサイズは小さいです。
ただし、プログラム中に何回も同じ中身のビューを参照するような状況では、参照するたびに内部でデータステップのプログラムが実行される事になるので、処理効率が悪くなります。




DATAステップビューの落とし穴


DATAステップビューで参照しているデータセットは、途中で変数を増やしたり減らしたり、属性情報(LENGTHや変数ラベル等)を変更したりするのはNGです。

以下の例では、データセットDT2をSETするという単純なDATAステップビューDSVIEW2を作成しています。

data DT2;
   length X $2.;
   X = "aa";
run;

data DSVIEW2 / view=DSVIEW2;
   set DT2;
run;


ここで、DT2を以下青文字の通り、作り直してみます(変数XのLENGTHを5に増やして"bbbbb"という値を格納)
そして、このDT2をSETしているDSVIEW2をPROC PRINTで出力してみます。

data DT2;
   length X $5.;
   X = "bbbbb";
run;

proc print data=DSVIEW2 noobs;
run;


あれ?Xには "bbbbb" が格納されているはずなのに、"bb"と出力されていて文字切れを起こしている??

原因として、DATAステップビューには「変数の型やLENGTHといった属性情報」も保存されており、ビューが参照された時にその属性情報が適用されるためです。




その他の落とし穴


「DATAステップビューはデータセットと違い実態がない」という事に起因して、一部のデータセットオプションが効かない事もあるので、動作について検証が必要です。


また、データステップ100万回でSQLビューとDATAステップビューの違いや、注意点についても書かれてるので、合わせてご参照下さい。

ビューの生成コードを出力するdescribeについて、SQLビューとデータステップビューだと方法が違うから気を付けてって話



0 件のコメント:

コメントを投稿