Como importar o IMDB database usando csvkit e copy

#dev, #docker

Iniciar o servidor e instalar dependências básicas

Se você não tem o PostgreSQL rodando na sua máquina você pode usar o Docker:

$ docker run -v imdb:/var/lib/postgresql/data --name imdbpg --rm postgres

Nós vamos precisar também do wget e python.

Se você está usando Docker antes de instalar as dependências execute esses comandos:

$ docker exec -it imdbpg bash
# apt-get update

Para instalar as dependências:

# apt-get --yes install wget python-dev python-pip postgresql-server-dev-all

Passo 1: Instalar o csvkit

Instale o csvkit usando o pip:

# pip install csvkit

Passo 2: Baixe e descompacte os arquivos

Você pode usar uma regex para baixar somente os arquivos com tsv.gz:

# wget -A "*tsv.gz" --mirror "https://datasets.imdbws.com/"
# gunzip datasets.imdbws.com/*gz

Passo 3: Importe os dados

# su - postgres
$ createdb imdb
$ for file in /datasets.imdbws.com/*tsv
do
  table_name=$(basename $file .tsv)
  head -n 20 $file | csvsql --no-constraints --table $table_name | sed "s/\(DECIMAL\|BOOLEAN\)/varchar/g" | psql imdb
  psql imdb -c "copy \"${table_name}\" from '${file}' delimiter E'\t'"
done

Note que eu substitui o tipo decimal e boolean por varchar, no meu caso eu preciso do banco de dados apenas para olhar os dados e como tive problema com essas colunas eu simplesmente substitui por varchar. Está longe de ser o ideal, mas para meu caso não tem nenhum problema.

Se você se importa com constraints e os tipos da coluna, você pode analisar os arquivo tsv por você mesmo ou usar o csvsql apenas para pegar o schema básico, de qualquer forma a importação é feita com o copy do PostgreSQL.

Posts nesta série

Referências