はじめに
この記事はデータサイエンス100本ノック環境構築時、テーブル作成されない場合の解決策を示すものである。
環境
- Windows 10 Home
問題
install から
docker-compose up -d --build
後、DBにテーブルが作成されていない状態となる。
原因
Windowsでgitを利用する場合、改行コードが変更されてしまうため。
https://github.com/The-Japan-DataScientist-Society/100knocks-preprocess#install
※ Windowsでgitを利用する場合、デフォルト設定でのインストールを行うとスクリプトの改行コードを変えられてしまい、データベースを正しく構築できないことがあります - #1 (comment)
※ 改行を変えないよう設定するか、ZIPをダウンロードして利用してください
解決策
以下から選択して実行
- ZIPダウンロード
- すでに
git clone
してしまった場合、1から環境構築し直す手間が発生
- すでに
- 改行を加えないように変更
- スクリプトを手動実行
- テーブル作成諸々のスクリプトが改行コードによって実行されていないだけなので、流しなおせばよい。
-> 他2つについては解説記事があるので、今回はこちらについて解説
- テーブル作成諸々のスクリプトが改行コードによって実行されていないだけなので、流しなおせばよい。
実行手順
- スクリプトの配置ディレクトリを把握
Tip
docker-compose.ymlに読み込みvolumesが定義されている
./docker/db/init:/docker-entrypoint-initdb.d
- dockerを立ち上げた後、適当な場所に
ipynb
を作成 - 下記クエリ実行(create_table, load抜き出し)
- 一旦これでJupyterNotebookからSQL実行可能となる
%%sql
/*
* create_table
*/
-- customer
drop table if exists customer;
create table customer(
customer_id VARCHAR(14),
customer_name VARCHAR(20),
gender_cd VARCHAR(1),
gender VARCHAR(2),
birth_day DATE,
age INTEGER,
postal_cd VARCHAR(8),
address VARCHAR(128),
application_store_cd VARCHAR(6),
application_date VARCHAR(8),
status_cd VARCHAR(12),
primary key (customer_id)
);
-- category
drop table if exists category;
create table category(
category_major_cd VARCHAR(2),
category_major_name VARCHAR(32),
category_medium_cd VARCHAR(4),
category_medium_name VARCHAR(32),
category_small_cd VARCHAR(6),
category_small_name VARCHAR(32),
primary key (category_small_cd)
);
-- product
drop table if exists product;
create table product(
product_cd VARCHAR(10),
category_major_cd VARCHAR(2),
category_medium_cd VARCHAR(4),
category_small_cd VARCHAR(6),
unit_price INTEGER,
unit_cost INTEGER,
primary key (product_cd)
);
-- store
drop table if exists store;
create table store(
store_cd VARCHAR(6),
store_name VARCHAR(128),
prefecture_cd VARCHAR(2),
prefecture VARCHAR(5),
address VARCHAR(128),
address_kana VARCHAR(128),
tel_no VARCHAR(20),
longitude NUMERIC,
latitude NUMERIC,
floor_area NUMERIC,
primary key (store_cd)
);
-- receipt
drop table if exists receipt;
create table receipt(
sales_ymd INTEGER,
sales_epoch INTEGER,
store_cd VARCHAR(6),
receipt_no SMALLINT,
receipt_sub_no SMALLINT,
customer_id VARCHAR(14),
product_cd VARCHAR(10),
quantity INTEGER,
amount INTEGER,
primary key (sales_ymd, store_cd, receipt_no, receipt_sub_no)
);
-- geocode
drop table if exists geocode;
create table geocode(
postal_cd VARCHAR(8),
prefecture VARCHAR(4),
city VARCHAR(30),
town VARCHAR(30),
street VARCHAR(30),
address VARCHAR(30),
full_address VARCHAR(80),
longitude NUMERIC,
latitude NUMERIC
);
/*
* load
*/
-- customer
COPY customer FROM '/tmp/data/customer.csv'
WITH CSV HEADER
;
-- category
COPY category FROM '/tmp/data/category.csv'
WITH CSV HEADER
;
-- product
COPY product FROM '/tmp/data/product.csv'
WITH CSV HEADER
;
-- receipt
COPY receipt FROM '/tmp/data/receipt.csv'
WITH CSV HEADER
;
-- store
COPY store FROM '/tmp/data/store.csv'
WITH CSV HEADER
;
-- geocode
COPY geocode FROM '/tmp/data/geocode.csv'
WITH CSV HEADER
;
warning
下記実行後でないとSQLは実行できないため、起動時に実行すること
%load_ext sql
import os
pgconfig = {
'host': 'db',
'port': os.environ['PG_PORT'],
'database': os.environ['PG_DATABASE'],
'user': os.environ['PG_USER'],
'password': os.environ['PG_PASSWORD'],
}
dsl = 'postgresql://{user}:{password}@{host}:{port}/{database}'.format(**pgconfig)
# MagicコマンドでSQLを書くための設定
%sql $dsl
以上