Cドライブの掃除

Cドライブの残量が1GBを切ってやばいので掃除

取り敢えずディスククリーンアップ(でも数十MBしか減らないね

Cドライブを徹底的にクリーンアップする方法|CRYSTAL

上の記事を参考に下記ディレクトリ下を削除して10GB確保

C:¥Windows¥Temp C:¥Users¥user¥Local

あとえらいchromeフォルダのサイズがでかいので調べてみたらshockwaveのtmpファイルが大量にあったのでそれも削除

C:¥Users¥user¥Local¥AppData¥Google¥Chrome¥User Data¥Default¥Pepper Data¥Shockwave Flash

計16GBくらい開きました

redisめも

download

Download – Redis

Redisサーバ起動

> redis-server redis.conf

Redisクライアント起動

> redis-cli

Document

redisドキュメント日本語訳 — redis 2.0.3 documentation Redis

Command

クライアント終了

> exit

内容をdumpしてサーバーを終了

> shutdown

データベースの切り替え
(デフォルトでは0が選択されている)

> select 1
ok
redis[1]>

> select 0
ok
redis>

データ保存

# dump.rbdにDump
> save

# バックでsave
> bgsave

データベースのサイズ確認

> dbsize
(integer) 1

データベースのクリア

# 選択しているdbをクリア
> flushdb

# すべてのdbをクリア
> flushall

バックアップ先

dump.rdb

PHPでredis

Predisを使用 nrk/predis · GitHub

接続

require './autoload.php';
Predis\Autoloader::register();
$client = new Predis\Client('tcp://127.0.0.1:6379');

SET GET

$client->set('key', 'value');
$value = $client->get('key');
echo "$value";

> value

Array

$arr = Array(
        'key1' => 'value1',
        'key2' => 'value2',
        'key3' => 'value3'
    );
$client->mset($arr);
$value = $client->mget(array_keys($arr));
var_dump($value);

> array(3) {
    [0]=>
        string(9) "value1"
    [1]=>
        string(9) "value2"
    [2]=>
        string(9) "value3"
}

Set

$client->sadd('testset','a');
$client->sadd('testset','b');
$client->sadd('testset','c');
$value = $client->smembers('testset');
var_dump($value);

> array(3) {
    [0]=>
        string(1) "b"
    [1]=>
        string(1) "a"
    [2]=>
        string(1) "c"
}

Sorted Set

$client->zadd('ranking',100,'user1');
$client->zadd('ranking',200,'user2');
$client->zadd('ranking',150,'user3');
$value = $client->zrank('ranking','user2');
echo "$value";

> 0

Hash

$client->hset('user','name','taro');
$client->hset('user','year','10');
$client->hset('user','sex','male');
$value = $client->hgetall('user');
var_dump($value);

> array(3) {
    ["name"]=>
        string(4) "taro"
    ["year"]=>
        string(2) "10"
    ["sex"]=>
        string(4) "male"
}

MySQL高速化めも

1.コミット頻度を減らす

数千件単位で明示的にcomit
増やしすぎても効果ない

2.バルクインサート

インサート文はまとめて(クエリ長を気にしつつ)

×

INSERT hoge INTO VALUES (1,'a');  
INSERT hoge INTO VALUES (2,'b');  
...

INSERT hoge INTO VALUES (1,'a'),(2,'b'),...  

max_allowed_packetを超えない範囲で

3.JOIN

複数テーブルをJOINする場合、期待通りの順番でJOINしてくれない(判断に時間がかかる)場合があるので
STRAIGHT_JOIN で順番を強制する

MySQL のJOIN に関するメモ - Slow Dance

4.EXPLAINでいろいろ見る

漢(オトコ)のコンピュータ道: MySQLのEXPLAINを徹底解説!!

ORDER BY句のキーが多すぎてUsing temporaryになっていたのでキーを減らした

漢(オトコ)のコンピュータ道: Using filesort

文字列操作

Hiveの文字列操作で使ったUDFメモ  

split  

split(string str, string pat)

文字列を指定パターンで分割する  

|datetime
+--------------------
|2014/07/17 13:30:00

split(datetime,' ')[0]

> 2014/07/17

split(datetime,' ')[1]

> 13:30:00

regexp_replace

regexp_replace(string INITIAL_STRING, string PATTERN, string REPLACEMENT)

文字列の正規表現で一致した部分を置換する

|date
+---------------------
|2014/07/17

regexp_replace(date,'\/','')

> 20140717

regexp_extract

regexp_extract(string subject, string pattern, int index)

文字列の正規表現で一致した部分を取得する

|date
+----------------------
|2014/07/17

regexp_extract(date,'^([0-9]*)\/',1)

> 2014

LanguageManual UDF - Apache Hive - Apache Software Foundation

GROUP毎の上位N位抽出

MySQLでGROUP BYした時に最初のN件を抽出する方法メモ

How to select the first/least/max row per group in SQL | Xaprb

に載っているユーザ変数を使う方法が簡単そう

テーブル

+----+-------+  
| id | chara |  
+----+-------+  
|  1 | A     |  
|  2 | C     |  
|  3 | B     |  
|  4 | C     |  
|  5 | B     |  
|  6 | D     |  
|  7 | C     |  
|  8 | D     |  
|  9 | F     |  
| 10 | C     |  
+----+-------+  

SQL

SET @num := 0, @chara := '';
SELECT
s.chara,
s.id
FROM
(SELECT 
id,
chara,
@num := IF(@chara = chara, @num + 1, 1) AS row_number,
@chara := chara AS dummy
FROM test5
ORDER BY chara,id) s
WHERE s.row_number <= 2;

結果

+-------+----+  
| chara | id |  
+-------+----+  
| A     |  1 |  
| B     |  3 |  
| B     |  5 |  
| C     |  2 |  
| C     |  4 |  
| D     |  6 |  
| D     |  8 |  
| F     |  9 |  
+-------+----+  

ファイル分類

はじめてのpigメモ

複数のファイルから種別毎にファイルを分類する

logfile1

type message
LOG0001 MESSAGE1
LOG0001 MESSAGE2
... ...
LOG0004 MESSAGE15

logfile2 ... 4

  • pigコマンド

    pig -x local

-x local でローカル実行(なしでhadoopモード)

  • Pig Latin

ファイルをロード

logfile = LOAD '/home/hadoop/logfile[0-9]'
USING PigStorage('\t') AS (
type:chararray, 
message:chararray);

USING PigStorageで区切り文字指定
ASでカラム名の指定

分割  

SPLIT logfile
INTO 
log1 IF type == 'LOG0001';

SPLIT INTO で条件毎にファイルを分割できる

DUMPで標準出力

DUMP log1;

(LOG0001,Message1)
(LOG0001,Message2)
(LOG0001,Message3)
...

STOREで指定ディレクトリに出力(ファイル名は自動)

STORE log1 INTO 'LOG0001' USING PigStorage();

./ --> LOG0001/ --> part-m-00000

ファイルで実行できる

[pigscript]

logfile = LOAD '/home/hadoop/logfile[0-9]'
USING PigStorage('\t') AS (
type:chararray, 
message:chararray);

SPLIT logfile
INTO 
log1 IF type == 'LOG0001',
log2 IF type == 'LOG0002',
log3 IF type == 'LOG0003',
log4 IF type == 'LOG0004';

STORE log1 INTO 'LOG0001' USING PigStorage();
STORE log2 INTO 'LOG0002' USING PigStorage();
STORE log3 INTO 'LOG0003' USING PigStorage();
STORE log4 INTO 'LOG0004' USING PigStorage();


# pig -x local -f pigscript

大量INSERT

TableA(1000万件)から100万件をTableBにInsertしたい

・1件ずつコミット

while ($i <= 1000000){

        $sql=qq{
insert into TableB select id,str from TableA where id=$i
};

        $dbh->do($sql);
        $dbh->commit();

        $i++;

}

処理時間

16分58秒

・1万件ずつコミット

$dbh->do($sql);
if ( $i % 10000 == 0){
    $dbh->commit();
}

処理時間

4分11秒

・10万件

5分11秒  
  • テストデータ作成

auto incrementで適当にデータを作る

CREATE TABLE HugeTable (
id INT(11) NOT NULL AUTO_INCREMENT,
str VARCHAR(32) NOT NULL,
PRIMARY KEY (id)
) ENGINE=INNODB

INSERT INTO HugeTable (str)
VALUES ('A'),('B'),('C'),('D'),('E'),('F')

SelectInsertしてふくらます

INSERT INTO HugeTable (str)
SELECT str FROM HugeTable

X n回