ablog

不器用で落着きのない技術者のメモ

SwingBench の Data Generator で Sales History のデータを生成する

準備

RDS Oracle
  • RDS Oracle データベースを作成する。
EC2
$ sudo yum install -y java-1.8.0-openjdk.x86_64
  • Data Generator をダウンロードする。
$ wget http://dominicgiles.com/swingbench/datagenerator17Nov.zip
  • 解凍する。
$ unzip datagenerator17Nov.zip
  • "ORA-12899: value too large for column" を回避するため CUSTOMER.CUST_EMAIL(VARCHAR2) を 30 byte から 50 byte に変更する。
$ cd datagenerator/bin
$ cp -p sh.xml sh.xml.org
         <Column>
            <ColumnName>CUST_EMAIL</ColumnName>
            <DataType>VARCHAR2</DataType>
            <PrimaryKey>false</PrimaryKey>
            <NullsAllowed>true</NullsAllowed>
            <Size>30</Size> ★これを30から50に変更する
$ unzip sqlcl-18.3.0.259.2029.zip

データを生成する

  • データを生成する
$ ./datagenerator -cl -db -c sh.xml -debug -cs oracle-ee-112.******.ap-northeast-1.rds.amazonaws.com:1521/orcl -u awsuser -p ********
  • テーブルが作成されデータが投入されていることを確認する。
SQL> select table_name from user_tables;
TABLE_NAME
PROMOTIONS
PRODUCTS
CHANNELS
CUSTOMERS
SUPPLEMENTARY_DEMOGRAPHICS
SALES
COUNTRIES

7 rows selected.
SQL> select count(1) from customers;
COUNT(1)
   1954180
SET ARRAYSIZE 2000
SET SQLFORMAT CSV
SET HEADING OFF FEEDBACK OFF
SET TERMOUT OFF

SPOOL promotions.csv
SELECT * FROM promotions;
SPOOL OFF

SPOOL products.csv
SELECT * FROM products;
SPOOL OFF

SPOOL channels.csv
SELECT * FROM channels;
SPOOL OFF

SPOOL customers.csv
SELECT * FROM customers;
SPOOL OFF

SPOOL supplementary_demographics.csv
SELECT * FROM supplementary_demographics;
SPOOL OFF

SPOOL sales.csv
SELECT * FROM sales;
SPOOL OFF

SPOOL countries.csv
SELECT * FROM countries;
SPOOL OFF
  • JSON形式で出力する。
$ sqlcl/bin/sql awsuser/<Password>@oracle-ee-112.******.ap-northeast-1.rds.amazonaws.com:1521/orcl
SQL> @sh2csv.sql

補足

  • デバッグするときは -debug オプションを指定する。
$ ./datagenerator -cl -debug ...
  • 実行中に以下のエラーが発生したので、
$ ./datagenerator -cl -db -c sh.xml -debug -cs oracle-ee-112.******.ap-northeast-1.rds.amazonaws.com:1521/orcl -u awsuser -p ********

10:58:25 PM SEVERE   [86] com.dom.datagen.kernel.DatabaseGenerationThread run() Unexpected Error :  ORA-12899: value too large for column "AWSUSER"."CUSTOMERS"."CUST_EMAIL" (actual: 31, maximum: 30)
java.sql.BatchUpdateException: ORA-12899: value too large for column "AWSUSER"."CUSTOMERS"."CUST_EMAIL" (actual: 31, maximum: 30)
  • ファイルにデータを出力して、
./datagenerator -cl -f -c sh.xml  -cs oracle-ee-112.******.ap-northeast-1.rds.amazonaws.com:1521/orcl  -u awsuser -p ********
  • 中身を確認すると、30文字以上のメールアドレスが存在する。
$ cd generateddata/
$ head -2 CUSTOMERS_124998.csv
692529,julio,silvia,F,1954,divorced,57 " "ablaze" "lane,OPZ" "803,Pembroke,924,Cambridgeshire,0,52770,080381212,G: 130000 - 149999,15000,[email protected]★メールアドレスは17列目,A924,305,0,02-Feb-2002 00:00:00,31-Dec-2010 00:00:00,A,
692531,freddie,chinn,M,1954,divorced,68 " "funny" "lane,OIP" "164,Kilmalcolm,922,Lincolnshire,0,52777,016491962,L: 300000 and above,10000,[email protected],A922,410,0,08-Jun-2004 00:00:00,31-Dec-2010 00:00:00,A,
$ perl -F, -lane 'print $F[16]' CUSTOMERS_124998.csv|wc -L
38 ★メールアドレスの文字数は最大38
$ perl -F, -lane 'print $F[16] if(length($F[16])>30)' CUSTOMERS_124998.csv|head -3
[email protected]30文字を超えているメールアドレスを確認する
[email protected]
[email protected]
  • sh.xml を変更する。
$ cd bin
$ vi sh.xml
         <Column>
            <ColumnName>CUST_EMAIL</ColumnName>
            <DataType>VARCHAR2</DataType>
            <PrimaryKey>false</PrimaryKey>
            <NullsAllowed>true</NullsAllowed>
            <Size>30</Size> ★これを30から50に変更すると回避できる