MySQL」タグアーカイブ

[MySQL]Twitter集計ではじめてMySQLを自分で設定した時のメモ

 

先日の立憲民主党フォロワー集計で、はじめてDBを自分で設定し使ってみた時の、備忘用リンク集とメモ書き。

■実行環境

  • サーバ :AWS EC2 t2.midium
  • OS : windows server 2012 R2
  • DB : MySQL5.7

1.Dataディレクトリを変更したらサービスが起動しない

「D:/MySQL」のディレクトリを作成後、隠しフォルダ以下の設定ファイル「C:\ProgramData\MySQL\MySQL Server 5.7\my.ini」を以下のように変更したところサービスが起動しなくなってしまった。

#datadir=C:/ProgramData/MySQL/MySQL Server 5.7/Data
datadir=D:/MySQL

こちらの情報にて解決。
Windows ServerにMySQLを入れてちょっとハマった事

MySQLの実行ユーザが「Network Service」なので、「D:/MySQL」ディレクトリにその実行ユーザをフルコントロールで追加した。

 

2.DBに入れた情報をcsvファイルに出力しようとしたら次のエラーになった

ERROR 1290 (HY000): The MySQL server is running with the –secure-file-priv option so it cannot execute this statement

こちらの情報にて解決。
[ MySQL ] データをCSVでエクスポートしようとして、secure-file-privに引っかかった件

最近のMySQLから「出力許可ディレクトリの設定がデフォルトで有効」になっているらしく、それ以外の場所を出力先に指定した為のエラーだった。
とりあえず「my.ini」のデフォルトの許可ディレクトリを空にしてサービス再起動し、どこにでも出力できるようにして対処。

# Secure File Priv.
#secure-file-priv=”C:/ProgramData/MySQL/MySQL Server 5.7/Uploads”
secure-file-priv=””

しかし出力先を「D:\users.csv」として出力しても何故か「D:\MySQL\users.csv」にファイルができる・・・何故だ。

 

3.テーブルの作成がめんどくさい

なんて言ったらDB本職の人から殴られそうですが。。。
最初にフィールド名とデータ型を定義してあげなきゃいけない。
取得するtwitterのユーザプロフィールには沢山の項目があって、それ全部のフィールド名とデータ型を定義するなんて面倒くさい。
しかも入れ子になってる項目はどうすればいいんだ、こっちはサーバとか多少触るけどDB素人やねんぞ!
と逆ギレしても仕方ないので、必要最低限のキーだけを入力する事とし、次のように定義して「users」テーブルを作成した。

CREATE TABLE users (
id_str bigint,
name text,
screen_name text,
protected char,
suspended char,
created_at datetime,
location text,
lang text,
statuses_count integer,
friends_count integer,
followers_count integer,
favourites_count integer,
last_tweet_time datetime
);

「last_tweet_time datetime」は最新のツイートの日時情報である「created_at」の情報。アカウント作成日時の方の「created_at」と被る為、別名にしている。

参考にしたのはこのページ
MySQLでテーブルを作成する方法【CREATE TABLE文】
MySQLのカラム型(有効範囲と必要記憶容量)

しかし項目が沢山ありどんな構造になってるのか把握するのも大変なtwitterの情報でいちいち定義なんてしてられない。次はjsonを定義無しにそのままぶち込めると言われるMongoDBを使ってみようと思った。MongoDBにもデメリットはあるようだが、自分1人が集計用に使うだけの後生大事にする必要もないデータであれば、問題ないだろう。

 

4.日時情報の変更

TwitterAPIに格納されてる日時情報はこんなフォーマットで使い勝手が悪い。

“created_at”: “Sat Oct 07 08:38:32 +0000 2017”

なのでMySQLのdatetimeに合わせて、こんな形に修正する必要がある。(日本時間なので+9時間もしておく)

“created_at”: “2017-10-07 17:38:32”

API取得とDB入力にはpythonを使ったが、時刻修正部分はdatetimeモジュールを使って以下のような処理にした。(dtに取得した値を入れて処理している)

dt_tmp = datetime.datetime.strptime(dt, “%a %b %d %H:%M:%S +0000 %Y”)
dt_tmp += datetime.timedelta(hours = 9)
dt = dt_tmp.strftime(‘%Y/%m/%d %H:%M:%S’)

■課題事項

  • インデックスについて何もしていない。いまのところそれほどパフォーマンスが落ちるような使い方でもデータ量でも無いようだが、そのうちきちんと調べておきたい。
  • データの性質と使用目的から考えると、定義する手間をかけるよりMongoDBでお手軽にjsonをそのままぶち込んだ方が良いかもしれない。次はMongoDBを使ってみる。(とは言え、項目も絞らずに全部入れるとDBサイズが大きくなるので、そのあたりの見極めもする)
  • 「D:\users.csv」にファイルを作成するつもりが、「D:\MySQL\users.csv」にできてしまう問題についてそのうち調べておく。