LoginSignup
1
1

More than 3 years have passed since last update.

Wikipediaデータ MySQLを経由してBigQueryにLoadする。シェルスクリプトバージョン

Last updated at Posted at 2020-04-28

概要

以前、GMOアドマーケティング Advent Calendar 2019の11日目に記載したWikipediaデータ MySQLを経由してBigQueryにLoadするのシェルスクリプト化です。DB接続情報とGCPのプロジェクト用の変数に設定を入れると動作します。

参考記事

Wikipediaデータ MySQLを経由してBigQueryにLoadする

環境

MySQL、GCPプロジェクト、Google Cloud SDK環境が事前に準備されていることとしております。

#!/usr/bin/env bash

#GCPプロジェクト
PROJECT=''

#DB接続情報
USER=''
PASS=''
HOST=''
PORT=''
DATABASE='wikipedia'

MYSQL="mysql -u ${USER} -p${PASS} -h ${HOST} --port ${PORT}"

if [ -z "$USER" ]; then
  echo 'Please set user information'
  exit 0
elif [ -z "$PASS" ]; then
  echo 'Please set pass information'
  exit 0
elif [ -z "$HOST" ]; then
  echo 'Please set host information'
  exit 0
elif [ -z "$PORT" ]; then
  echo 'Please set port information'
  exit 0
elif [ -z "$PROJECT" ]; then
  echo 'Please set project information'
  exit 0
fi

cd /tmp/

#wikipediaのdump取得
#ページ情報
echo 'download jawiki-latest-page.sql.gz'
wget https://dumps.wikimedia.org/jawiki/latest/jawiki-latest-page.sql.gz
#カテゴリ間リンク情報
echo 'download jawiki-latest-categorylinks.sql.gz'
wget https://dumps.wikimedia.org/jawiki/latest/jawiki-latest-categorylinks.sql.gz
#ページ間リンク情報
echo 'download jawiki-latest-pagelinks.sql.gz'
wget https://dumps.wikimedia.org/jawiki/latest/jawiki-latest-pagelinks.sql.gz

#解凍
echo 'unzip jawiki-latest-pagelinks.sql.gz'
gzip -d /tmp/jawiki-latest-page.sql.gz
echo 'unzip jawiki-latest-categorylinks.sql.gz'
gzip -d /tmp/jawiki-latest-categorylinks.sql.gz
echo 'unzip jawiki-latest-pagelinks.sql.gz'
gzip -d /tmp/jawiki-latest-pagelinks.sql.gz

#DB作成
echo 'CREATE DATABASE'
echo "CREATE DATABASE IF NOT EXISTS ${DATABASE}" | $MYSQL

#テーブル削除
echo 'DROP TABLE page'
echo "DROP TABLE IF EXISTS ${DATABASE}.page" | $MYSQL
echo 'DROP TABLE categorylinks'
echo "DROP TABLE IF EXISTS ${DATABASE}.categorylinks" | $MYSQL
echo 'DROP TABLE pagelinks'
echo "DROP TABLE IF EXISTS ${DATABASE}.pagelinks" | $MYSQL

#レコード挿入
echo 'import jawiki-latest-page.sql'
$MYSQL $DATABASE < /tmp/jawiki-latest-page.sql
echo 'import jawiki-latest-categorylinks.sql'
$MYSQL $DATABASE < /tmp/jawiki-latest-categorylinks.sql
echo 'import jawiki-latest-pagelinks.sql'
$MYSQL $DATABASE < /tmp/jawiki-latest-pagelinks.sql

#csv 吐き出し
echo 'export jawiki_page.csv'
$MYSQL -e "SELECT * FROM ${DATABASE}.page;" | perl -pe 's;,;、;g' | perl -pe 's;\t;,;g' > /tmp/jawiki_page.csv
echo 'export jawiki_categorylinks.csv'
$MYSQL -e "SELECT * FROM ${DATABASE}.categorylinks;" | perl -pe 's;,;、;g' | perl -pe 's;\t;,;g' > /tmp/jawiki_categorylinks.csv
echo 'export jawiki_pagelinks.csv'
$MYSQL -e "SELECT * FROM ${DATABASE}.pagelinks;" | perl -pe 's;,;、;g' | perl -pe 's;\t;,;g' > /tmp/jawiki_pagelinks.csv

#圧縮
echo 'zip jawiki_page.csv'
gzip /tmp/jawiki_page.csv
echo 'zip jawiki_categorylinks.csv'
gzip /tmp/jawiki_categorylinks.csv
echo 'zip jawiki_pagelinks.csv'
gzip /tmp/jawiki_pagelinks.csv

#Big Query Load
echo 'bq load jawiki_page'
bq load \
  --null_marker="" \
  --allow_quoted_newlines \
  --allow_jagged_rows \
  --source_format CSV \
  --quote "" \
  --max_bad_records 10000 \
  --replace \
  $PROJECT:$DATABASE.page \
  /tmp/jawiki_page.csv.gz \
  page_id,page_namespace:integer,page_title,page_restrictions,page_is_redirect:integer,page_is_new:integer,page_random,page_touched,page_links_updated,page_latest:integer,page_len:integer,page_content_model,page_lang

echo 'bq load categorylinks'
bq load \
  --null_marker="" \
  --allow_quoted_newlines \
  --allow_jagged_rows \
  --source_format CSV \
  --max_bad_records 10000 \
  --replace \
  $PROJECT:$DATABASE.categorylinks \
  /tmp/jawiki_categorylinks.csv.gz \
  cl_from,cl_to,cl_sortkey,cl_timestamp,cl_sortkey_prefix,cl_collation,cl_type

echo 'bq load pagelinks'
bq load \
  --null_marker="" \
  --allow_quoted_newlines \
  --allow_jagged_rows \
  --source_format CSV \
  --max_bad_records 1000000 \
  --replace \
  $PROJECT:$DATABASE.pagelinks \
  /tmp/jawiki_pagelinks.csv.gz \
  pl_from,pl_namespace:integer,pl_title,pl_from_namespace:integer
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1