例: CASでのテーブルの管理

CASテーブルに対してCASでDATAステップを実行する

コード例

入力データを使用してCASでDATAステップを実行するには、入力と出力の両方がCASテーブルであり、両方のテーブルが同じCASエンジンライブラリ参照名を使用している必要があります。次の例では、CASUTILプロシジャを使用して、SASデータセットをインメモリテーブルとしてCASにロードしています。SASデータセット名の前には、CASエンジンライブラリ参照名mycasが付きます。

proc casutil outcaslib='casuser';
   load data=sashelp.cars;                /* 1 */
run;

data mycas.cars2 / sessref=casauto;       /* 2 */
   set mycas.cars;                        /* 3 */
   if mpg_city > 25 then eff='Y';
      else eff='N';
   put 'Thread number: '  _threadid_  
       'on worker node '  _hostname_;
run;
  1. PROC CASUTILを使用して、Sashelp.CarsデータセットをCASにロードします。これにより、Carsという名前のインメモリCASテーブルが作成されます。OUTCASLIB=オプションで、CASテーブルがCASUSER caslibにロードされます。

  2. CASエンジンライブラリ参照名を使用して、CASテーブルを出力データとして指定します。

  3. CASエンジンライブラリ参照名を使用して、CASテーブルを入力データとして指定します。

要点

See Also

CSVファイルをCASにロードし、CASテーブルとして保存する

コード例

次の例は、DATAステップを使用してカンマ区切り値ファイル(CSV)をCASにロードし、テーブルを保存する方法を示しています。この例では、names.csvファイルを使用しています。このファイルは、http://support.sas.com/documentation/onlinedoc/viya/examples.htmにあります。

これらのセクションの例を実行する方法については、例のコードの設定を参照してください。

filename names url 
 "http://support.sas.com/documentation/onlinedoc/viya/exampledatasets/names.csv";

data mycas.names;
  infile names dsd truncover firstobs=2;                  /* 1 */
  input BRTH_YR :$10. GNDR :$10. ETHCTY :$10. NM :$10. 
            CNT :$10.  RNK :$10.;                         /* 2 */
run;

proc casutil incaslib='casuser';                          /* 3 */ 
   save casdata='names' outcaslib='casuser' replace; 
   list; 
run;             

CSVファイルとそのコンテンツの部分的な表示を次に示します。

BRTH_YR,GNDR,ETHCTY,NM,CNT,RNK
2011,FEMALE,HISPANIC,GERALDINE,13,75
2011,FEMALE,HISPANIC,GIA,21,67
2011,FEMALE,HISPANIC,GIANNA,49,42
2011,FEMALE,HISPANIC,GISELLE,38,51
        <more rows>
2014,MALE,WHITE NON HISPANIC,Youssef,24,88
2014,MALE,WHITE NON HISPANIC,Yusuf,16,96
2014,MALE,WHITE NON HISPANIC,Zachary,90,39
2014,MALE,WHITE NON HISPANIC,Zev,49,65
  1. SASでは、INFILEステートメントを使用して、外部カンマ区切りファイルをロードします。出力テーブルでCASエンジンライブラリ参照名を指定します。TRUNCOVERオプションを使用すると、SASで可変長レコードを正しく読み取ることができます。値が割り当てられていない変数は、欠損に設定されます。

  2. INPUTステートメントを指定して列名をリストし、入力形式として読み取ります。

  3. インメモリCASテーブルの永続的なコピーを保存します。

要点

See Also

CASテーブルをSASデータセットに変換する

コード例

次の例は、DATAステップを使用して、インメモリCASテーブルをSASデータセットに変換する方法を示しています。最初のDATAステップでは、この例の変換に使用できるインメモリCASテーブルを作成します。2番目のDATAステップでは、CASテーブルを読み取り、ローカルSASWorkライブラリにSASデータセットを作成します。

data mycas.earnings;                           
   Amount=1000;                             /* 1 */
   Rate=.075/12; 
   do month=1 to 12;   
      Earned +(amount+earned)*(rate);   
   end;  
   run;
proc print data=mycas.earnings;run;

libname mysas "/file-path/";               /* 2 */
data mysas.earnings;                       /* 3 */
   set mycas.earnings;
run; 
  1. テーブルの変数を作成し、DOステートメントを使用して受取利息を計算します。

  2. データセットを保存するためにMysasという名前のライブラリ参照名を作成します。ライブラリ参照名Mysasは、Earningsデータセットが保存される物理的な場所を表します。

  3. CASテーブルを読み取り、SASデータセットとしてSASライブラリに書き込みます。

4つの列と合計収益77.6326を含むEarningsデータセットを示す出力

要点

  • デフォルトでは、出力テーブルはあるが入力テーブルはないCAS DATAステップが単一のスレッドで実行されます。DATAステートメントでSINGLE=NOオプションを指定すると、DATAステップを強制的に複数のスレッドで実行できます。SINGLE=オプションの指定については、SINGLE=NO | NOINPUT | YES (SAS DATAステップステートメント: リファレンス)を参照してください。
  • DATAステップの実行場所やDATAステップ処理モードの制御の詳細については、処理環境およびスレッド処理の制御ルールを参照してください。
  • CAS DATAステップは、CASテーブルでのみ機能します。

See Also

CSVファイルをCASテーブルにロードする

コード例

次の例は、カンマ区切り値ファイル(CSV)をCASにロードする方法を示しています。この例では、names.csvファイルを使用しています。このファイルは、http://support.sas.com/documentation/onlinedoc/viya/examples.htmにあります。

CASにロードされたテーブルを保存する方法については、ロードされたCASテーブルを保存するを参照してください。

これらのセクションの例を実行する方法については、例のコードの設定を参照してください。

ここでは、入力ファイルを部分的に表示して、その構造と変数を示しています。

BRTH_YR,GNDR,ETHCTY,NM,CNT,RNK
2011,FEMALE,HISPANIC,GERALDINE,13,75
2011,FEMALE,HISPANIC,GIA,21,67
2011,FEMALE,HISPANIC,GIANNA,49,42
2011,FEMALE,HISPANIC,GISELLE,38,51
        <more rows>
2014,MALE,WHITE NON HISPANIC,Youssef,24,88
2014,MALE,WHITE NON HISPANIC,Yusuf,16,96
2014,MALE,WHITE NON HISPANIC,Zachary,90,39
2014,MALE,WHITE NON HISPANIC,Zev,49,65

filename names url                                        /* 1 */
 "http://support.sas.com/documentation/onlinedoc/viya/exampledatasets/names.csv";

proc import datafile=names                                /* 2 */ 
            dbms=csv 
            out=mycas.names      /* 3 */
            replace;
run;
proc print data=mycas.names; run;  /* 4 */
  1. FILENAMEステートメントとURLアクセスメソッドを指定して、Webサイトhttp://support.sas.com/documentation/onlinedoc/viya/examples.htmからnames.csvにアクセスします。

  2. IMPORTプロシジャを指定してnames.csvファイルを読み取り、CASエンジンライブラリ参照名を使用してCASテーブルに直接書き込みます。なお、出力テーブルにはCASエンジンライブラリ参照名を指定する必要があるため、例のコードの設定に示すようにLIBNAMEステートメントを使用して作成する必要があります。

  3. PRINTプロシジャを指定して、ロードしたCASテーブルを表示します。

CASへのCSVファイルのロードの部分的なPROC PRINT出力
CASにロードされたCSVファイルの部分的なPROC PRINT出力

要点

  • DATAステップでINFILEステートメントを指定し、出力テーブルにCASエンジンライブラリ参照名を指定することで、外部ファイルをCASにロードすることができます。
  • CASUTILプロシジャのLOAD FILEステートメントを使用して、外部ファイルをCASにロードすることもできます。PROC CASUTILを使用してファイルをCASにロードする方法を示す例は、CSVファイルをCASにロード (SAS Cloud Analytic Services: ユーザーガイド)、クライアント側ファイルのロードおよび サーバー側ファイルのロードです。

See Also

ロードされたCASテーブルを保存する

コード例

次の例は、DATAステップを使用してカンマ区切り値ファイル(CSV)をCASにロードし、テーブルを保存する方法を示しています。この例では、names.csvファイルを使用しています。このファイルは、http://support.sas.com/documentation/onlinedoc/viya/examples.htmにあります。

これらのセクションの例を実行する方法については、例のコードの設定を参照してください。

filename names url 
 "http://support.sas.com/documentation/onlinedoc/viya/exampledatasets/names.csv";

data mycas.names;
  infile names dsd truncover firstobs=2;                  /* 1 */
  input BRTH_YR :$10. GNDR :$10. ETHCTY :$10. NM :$10. 
            CNT :$10.  RNK :$10.;                         /* 2 */
run;

proc casutil incaslib='casuser';                          /* 3 */ 
   save casdata='names' outcaslib='casuser' replace; 
   list; 
run;             

CSVファイルとそのコンテンツの部分的な表示を次に示します。

BRTH_YR,GNDR,ETHCTY,NM,CNT,RNK
2011,FEMALE,HISPANIC,GERALDINE,13,75
2011,FEMALE,HISPANIC,GIA,21,67
2011,FEMALE,HISPANIC,GIANNA,49,42
2011,FEMALE,HISPANIC,GISELLE,38,51
        <more rows>
2014,MALE,WHITE NON HISPANIC,Youssef,24,88
2014,MALE,WHITE NON HISPANIC,Yusuf,16,96
2014,MALE,WHITE NON HISPANIC,Zachary,90,39
2014,MALE,WHITE NON HISPANIC,Zev,49,65
  1. SASでは、INFILEステートメントを使用して、外部カンマ区切りファイルをロードします。出力テーブルでCASエンジンライブラリ参照名を指定します。TRUNCOVERオプションを使用すると、SASで可変長レコードを正しく読み取ることができます。値が割り当てられていない変数は、欠損に設定されます。

  2. INPUTステートメントを指定して列名をリストし、入力形式として読み取ります。

  3. インメモリCASテーブルの永続的なコピーを保存します。

要点

  • DATAステップでINFILEステートメントを指定し、出力テーブルにCASエンジンライブラリ参照名を指定することで、外部ファイルをCASにロードすることができます。
  • CASUTILプロシジャのLOAD FILEステートメントを使用して、外部ファイルをCASにロードすることもできます。PROC CASUTILを使用してファイルをCASにロードする方法を示す例は、CSVファイルをCASにロード (SAS Cloud Analytic Services: ユーザーガイド)、クライアント側ファイルのロードおよび サーバー側ファイルのロードです。

See Also

SETステートメントとBYステートメントを使用してテーブルを結合する

コード例

次の例では、2つのデータセットを作成し、PROC CASUTILを使用してCASテーブルにロードします。最初のDATAステップでは、一方を他方に連結して2つのデータセットを結合します。これは、テーブルを互いに追加することに似ています。2番目のDATAステップでは、BYステートメントを追加して2つのデータセットをインタリーブします。BY変数はCommonとNumberです。

これらのセクションの例を実行する方法については、例のコードの設定を参照してください。


data animal1;                                /* 1 */
input Common $ Animal $ 3-8     
      Number 10-11;          
datalines; 
a Ant    1
b Bird   2
c Cat    3
d Dog    4
e Eagle  5
f Frog   6
g Goose  7
h Hawk   8
i Impala 9
;                     
data plant1;                                 /* 2 */
input Common $ Plant $ 3-10 
      Number 12-13;
datalines;
a Grape    1
c Hazelnut 2
e Indigo   3
g Jicama   4
i Kale     5
;

data append;                                 /* 3 */
  set animal1 plant1;
run;

proc print data=append;     
title '1. Plant1 Appended to Animal1 in a ';
title2 'DATA Step Running in SAS'; run;

data interleaveByCommon;                     /* 4 */
  set animal1 plant1;
  by common; run;

proc print data=interleaveByCommon;    
title '2. Animals and Plants Interleaved 
          by Variable COMMON';
title2 'in a DATA Step Running in SAS'; 
run;

data interleaveByCommonNumber;               /* 5 */
   set animal1 plant1;
   by common Number; run;

proc print data=interleaveByCommonNumber;
title '3. Animals and Plants Interleaved 
          by Common and Number';
title2 'in a DATA Step Running in SAS'; 
run;

proc casutil incaslib="casuser"              /* 6 */ 
             outcaslib="casuser"; 
  load data=animal1 replace;
  load data=plant1 replace; 
run;

data mycas.appendCas / sessref=casauto;      /* 7 */
   set mycas.animal1 mycas.plant1;
   hostname=_hostname_; run;

proc print data=mycas.appendCas;
title  '4. Plant1 Appended to Animal1 in a';
title2 'Multithreaded DATA Step 
        Running in CAS'; 
run;
     

data mycas.byCommon / sessref=casauto; 
   set mycas.animal1 mycas.plant1;           /* 8 */
   by common; 
   hostname=_hostname_; run;

proc print data=mycas.byCommon;
title '5. Animal and Plant Combined 
          by Common';
title2 'in a Multithreaded DATA Step 
        Running in CAS'; 
run;

data mycas.ByCommonNumber / sessref=casauto; /* 9 */
   set mycas.animal1 mycas.plant1;
   by common Number; 
   hostname=_hostname_;  
run;

proc print data=mycas.ByCommonNumber; 
title '6. Animal and Plant Combined 
         by Common and Number'; 
title2 'in a DATA Step Running in CAS'; 
run;
  1. 最初のデータセットを作成します。

  2. 2番目のデータセットを作成します。

  3. SETステートメントを指定して、PlantデータセットをAnimalデータセットに追加します。BYステートメントは使用されません。

  4. BYステートメントで1つの変数を使用して、2つのデータセットをインタリーブします。

  5. BYステートメントで2つの変数を使用して、2つのデータセットをインタリーブします。

  6. データセットをCASにロードします。

  7. CASで実行されているDATAステップでSETステートメントのみを指定して、2つのデータセットを結合します。BYステートメントは使用されません。

  8. CAS DATAステップのBYステートメントで1つの変数を使用して、2つのデータセットを結合します。

  9. CAS DATAステップのBYステートメントで2つの変数を使用して、2つのデータセットを結合します。

要点

  • データセットの連結とは、2つ以上のデータセットを1つずつ結合して単一のデータセットにすることです。連結では、複数の入力テーブルでSETステートメントが使用されます。最初のデータセットからすべてのオブザベーションが読み取られ、続いて2番目のデータセットからすべてのオブザベーションが読み取られます。
  • インタリーブでは、SETステートメントとBYステートメントを使用して、複数のデータセットを1つの新しいデータセットに結合します。
  • データセットをインタリーブする前に、データは、SETステートメントに付随するBYステートメントで使用される変数と同じ変数で並べ替える必要があります。
  • BYグループ内の行の順序は、CAS内では一定ではありません。追加のBY変数を明示的に指定して行を順序付けしない限り、順序はDATAステップジョブごとに変わる可能性があります。一定の順序付けが必要な場合は、追加のBY変数を明示的に指定します。 BYグループ処理とパーティション分割を参照してください。
  • BYステートメントでは、BY変数に同じ値を持つ2つのデータセットの行が結合されます。
  • テーブルを連結するかわりに、テーブルを追加して、連結と同じ結果を生成できます。両方のテーブルのすべてのレコードを読み取らないようにするには、APPEND=データセットオプションを使用して、一方のテーブルを他方のテーブルに追加します。

See Also

プロモートされたテーブルに行をフィルタリングして追加する

コード例

次の例では、APPEND=データセットオプションを使用して、プロモートされたCASテーブルにCASテーブルを追加しています。


data mycas.class(promote=yes);           /*1*/
   set sashelp.class;                  
   where Weight>115;                     /*2*/
run;

data mycas.addClass;                     /*3*/
input Name $ Sex $ Age Height Weight;
datalines;
Aaron M 13  64 112
Becky F 16  68 125
;

data mycas.class(append=force);  /*4*/ 
   set mycas.addClass;  
   where weight>115;                                   /*5*/ 
run;
proc print data=mycas.class; run;  /*6*/
 
  1. SASデータセットclassをSashelpライブラリから読み取って、テーブルmycas.classを作成します。PROMOTE=データセットオプションを指定して、テーブルをグローバルスコープにプロモートします。

    注: すでにグローバルスコープにプロモートしている既存のテーブルにPROMOTE=データセットオプションを指定することはできません。たとえば、このサンプルプログラムを再度実行しようとしたときに、mycas.classデータセットがmycasライブラリに残っていると、エラーが発生します。プロモートされたテーブルを削除してから、PROMOTE=データセットオプションを含むDATAステートメントに置き換える必要があります。データセットを削除するには、proc datasets lib=mycas; delete class; run;というコードを使用します。
  2. WHEREステートメントを使用して、変数Ageが15より大きい行のみを選択します。

  3. INPUTステートメントで変数名とその型を指定し、DATALINESステートメントで変数値を指定して、2番目のテーブルを作成します。

  4. DATAステートメントにAPPEND= CASデータセットオプションを指定して、mycas.addClassテーブルをmycas.classテーブルに追加します。2つのテーブルには同じ変数が含まれていますが、変数Sexは2つのテーブルで異なる長さになっています。テーブルmycas.addClassでは8バイト、テーブルmycas.addClassでは1バイトの長さです。そのため、APPEND=ステートメントでFORCEオプションを指定する必要があります。

  5. WHEREステートメントを指定して、weightが115より大きい行のみを選択します。

  6. 結果を出力します。

Mycas.Classテーブル
Mycas.Classテーブル
Mycas.addClassテーブル
Mycas.addClassテーブル
フィルタリングされたMycas.addClassをMycas.Classテーブルに追加したPROC PRINT出力
フィルタリングされたMycas.addClassをMycas.Classテーブルに追加したPROC PRINT出力

また、LENGTHステートメントを使用して、変数の長さを変更することもできます。

data mycas.addClass;
   length Sex $1;
   set mycas.class;
run;

要点

  • APPEND=FORCEを指定しない限り、入力テーブルの変数の長さは同じにする必要があります。
  • FORCEオプションは、インメモリテーブルの文字長を使用して、入力オブザベーションの長さを決定します。入力データの文字長サイズが出力テーブルの文字長サイズを超えた場合、切り捨てエラーが発生します。
  • 入力データセットの名前、長さ、出力形式などの変数属性は同じにする必要があります。
  • すでにグローバルスコープにプロモートしている既存のテーブルにPROMOTE=データセットオプションを指定することはできません。プロモートされたテーブルを削除してから置き換える必要があります(proc datasets lib=mycas; delete class; run;)。
  • PROMOTE=オプションとAPPEND=オプションを同時に指定することはできません。
  • パーティション分割と順序付けの両方が行われたテーブルに行を追加することはできません。

See Also

最終更新: 2026年7月31日