AWS導入(2)
こんな感じjsonをいい感じのテーブルにしてあげたい。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
{'time':
'20201024121805696000',
'bids0':
1359640.0,
'bids0_size':
0.1,
'bids1':
1359635.0,
'bids1_size':
0.2,
'bids2':
1359080.0,
'bids2_size':
0.1,
'bids3':
1359070.0,
'bids3_size':
0.1,
'bids4':
1359061.0,
'bids4_size':
0.075,
'asks0':
1359640.0,
'asks0_size':
0.1,
'asks1':
1359635.0,
'asks1_size':
0.2,
'asks2':
1359080.0,
'asks2_size':
0.1,
'asks3':
1359070.0,
'asks3_size':
0.1,
'asks4':
1359061.0,
'asks4_size':
0.075} |
DynamoDBのまとめ
DynamoDB自体触るの初めてなので、NoSQLだよーとは聞くもののわからないこと多いので記録
このサイトから抜粋

大事な点としては
- KV(Key value方式)
- JOINはできない!
- 要はRDBMSから完全な移管は不可
- 昔は正規化ガンガンしていたが、そんなことはしない。実務ベースでどのキーで検索を書けるかが超重要
- テーブル定義時にINDEXを設定。そのキーの変更はできない
- INDEXをキー以外の検索は最悪全探索なので効率が悪い
- ただし、Global/Local secondary Indexっていう「繋がりINDEX」を指定することでレコード間のつながりを表現できる(グラフっぽい?)
- Global/loccalの違いは利用方法の違い。繋がり名から検索するか、繋がり名を中間のキーとして検索するか
- ただし、Global/Local secondary Indexっていう「繋がりINDEX」を指定することでレコード間のつながりを表現できる(グラフっぽい?)
- 要は検索が得意ではない
- HASHとSORTで成立して、HASHは分散検索用で、SORTは分散時の並び順(検索に相当)
- PK(partition key )=HASH
- HASHとSORTで成立して、HASHは分散検索用で、SORTは分散時の並び順(検索に相当)
- トランザクションというのはない
- 速さ重視なので状況次第で可用性(A: 常にRWができる)と整合性(C: 読み込み結果が正しい)がおざなり。(と推測)
- 分断体制(P)は保証
- RDBMSはトランザクションあるんで関連テーブルとかを全チェックしちゃうので、オーバーヘッド大きい&速度遅い
- 速さ重視なので状況次第で可用性(A: 常にRWができる)と整合性(C: 読み込み結果が正しい)がおざなり。(と推測)
- その代わり、INDEX以外の項目を身勝手に追加できる
- これがRDBとは違うスキーマレスの考え方
- 身勝手に追加できるので、細かい項目決まってないPJとかにはいいかも
- 逆にスキーマレスなので、正規化いらないでしょ?的な思考らしい
- AWSガイド上でも頑張れば1つのテーブルでいくことがベストプラクティスとのこと
- これがRDBとは違うスキーマレスの考え方
テーブルつくる
コンソール上でもできるが、CFnに入れたいのでjsonでかく。というかローカルでなんとかしたい
紆余曲折を経て、こうなりました。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
(py37b)
Macico:kuloko macico$
cat quote_table.json { "TableName":
"Quote", "AttributeDefinitions":[ {"AttributeName":
"feed_datetime", "AttributeType":
"S"}, {"AttributeName":
"sym", "AttributeType":
"S"} ], "KeySchema":[ {"AttributeName":
"sym"
, "KeyType":
"HASH"
}, {"AttributeName":
"feed_datetime"
, "KeyType":
"RANGE"
}], "ProvisionedThroughput":{ "ReadCapacityUnits":
5, "WriteCapacityUnits":
5 } } |
ポイント
- feed_datetimeという名称に変更しました。これはdynamodbのreservedワードだったからww
- 予約語を項目名にしてるとでちゃう(自分はクエリ叩いたときに気づいた)
- attribbute definition はindexとなりうるものたち。つまり、ここに書くキー全てがはHASHかRANGEのどちらかに定義されている必要あり。その定義はkeyschemaかGlobal/Local SIに書く。
- キーの中身はString(S), Numeric(N), BInary(B)を指定
- 詳細はAWSみてね
- Provisioningは必須
- 他の項目(上で言うところの身勝手に追加できる項目)はINDEXではないので、ここにかかなくていい
- ↑の定義はjsonで書いているよ。–cli-input-yamlはない。(あるって書いてあるけど…わからない)
- ここに書いてある定義の変更は不可
- ただしGSLは行ける。R/W CUも行ける。
最初は、全部ask1とか突っ込むかと思ったけど違った。認識甘かった
突っ込んで、確認します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
(py37b)
Macico:kuloko macico$
aws dynamodb create-table
--cli-input-json file://quote_table.json --endpoint-url http://localhost:8000 { "TableDescription":
{ "AttributeDefinitions":
[ { "AttributeName":
"feed_datetime", "AttributeType":
"S" }, { "AttributeName":
"sym", "AttributeType":
"S" } ], "TableName":
"Quote", "KeySchema":
[ { "AttributeName":
"sym", "KeyType":
"HASH" }, { "AttributeName":
"feed_datetime", "KeyType":
"RANGE" } ], "TableStatus":
"ACTIVE", "CreationDateTime":
1603587197.54, "ProvisionedThroughput":
{ "LastIncreaseDateTime":
0.0, "LastDecreaseDateTime":
0.0, "NumberOfDecreasesToday":
0, "ReadCapacityUnits":
5, "WriteCapacityUnits":
5 }, "TableSizeBytes":
0, "ItemCount":
0, "TableArn":
"arn:aws:dynamodb:ddblocal:000000000000:table/Quote" } } |
|
1 2 3 4 5 6 7 8 |
(py37b)
Macico:kuloko macico$ aws dynamodb list-tables
\ > --endpoint-url http://localhost:8000 { "TableNames":
[ "Access", "Quote" ] } |
*Accessは関係ないです。
テストデータを入れます。JSONっぽくいれます。
|
1 2 3 4 5 |
(py37b)
Macico:kuloko macico$
aws dynamodb put-item
--table-name Quote
--item
'{"feed_datetime":{"S":"20201001125959100"}, "sym":{"S":"BTC"}, "ask1":{ "N":"100.0"}, "ask1_size":{ "N":"2.0"}, "ask2":{ "N":"101.0"}, "ask2_size":{ "N":"3.0"}, "ask3":{ "N":"102.0"}, "ask3_size":{ "N":"23.0"}, "ask4":{ "N":"103.0"}, "ask4_size":{ "N":"32.0"}, "ask5":{ "N":"104.0"}, "ask5_size":{ "N":"233.0"},"bid1":{ "N":"99.0"}, "bid1_size":{ "N":"233.0"}, "bid2":{ "N":"98.0"}, "bid2_size":{ "N":"3112.0"},"bid3":{ "N":"97.0"}, "bid3_size":{ "N":"20"}, "bid4":{ "N":"96.0"}, "bid4_size":{ "N":"133.0"},"bid5":{ "N":"95.0"}, "bid5_size":{ "N":"54.0"}}'
--endpoint-url http://localhost:8000 (py37b)
Macico:kuloko macico$ aws dynamodb put-item
\ >
--table-name Quote
\ >
--item
'{"feed_datetime":{"S":"20201001125959101"}, "sym":{"S":"BTC"}, "ask1":{ "N":"100.5"}, "ask1_size":{ "N":"2.0"}, "ask2":{ "N":"101.0"}, "ask2_size":{ "N":"3.0"}, "ask3":{ "N":"102.0"}, "ask3_size":{ "N":"23.0"}, "ask4":{ "N":"103.0"}, "ask4_size":{ "N":"32.0"}, "ask5":{ "N":"104.0"}, "ask5_size":{ "N":"233.0"},"bid1":{ "N":"99.0"}, "bid1_size":{ "N":"233.0"}, "bid2":{ "N":"98.0"}, "bid2_size":{ "N":"3112.0"},"bid3":{ "N":"97.0"}, "bid3_size":{ "N":"20"}, "bid4":{ "N":"96.0"}, "bid4_size":{ "N":"133.0"},"bid5":{ "N":"95.0"}, "bid5_size":{ "N":"54.0"}}'\ > --endpoint-url http://localhost:8000 |
単一項目get
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
(py37b)
Macico:kuloko macico$
aws dynamodb get-item
\ >
--table-name Quote
\ >
--key
'{"feed_datetime":{"S":"20201001125959100"}, "sym":{"S":"BTC"}}'
\ >
--endpoint-url http://localhost:8000 { "Item":
{ "bid4_size":
{ "N":
"133" }, "ask3_size":
{ "N":
"23" }, "sym":
{ "S":
"BTC" }, "bid1_size":
{ "N":
"233" }, "ask5":
{ "N":
"104" }, "ask2":
{ "N":
"101" }, "bid2_size":
{ "N":
"3112" }, "ask1":
{ "N":
"100" }, "ask2_size":
{ "N":
"3" }, "ask5_size":
{ "N":
"233" }, "ask1_size":
{ "N":
"2" }, "ask4":
{ "N":
"103" }, "bid5":
{ "N":
"95" }, "bid5_size":
{ "N":
"54" }, "ask3":
{ "N":
"102" }, "feed_datetime":
{ "S":
"20201001125959100" }, "bid3":
{ "N":
"97" }, "ask4_size":
{ "N":
"32" }, "bid4":
{ "N":
"96" }, "bid1":
{ "N":
"99" }, "bid2":
{ "N":
"98" }, "bid3_size":
{ "N":
"20" } } } |
クエリっぽくいけます
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
(py37b)
Macico:kuloko macico$
aws dynamodb query
\ >
--table-name Quote
\ >
--key-condition-expression
'feed_datetime = :feed_datetime and sym = :sym'
\ >
--expression-attribute-values
'{ ":feed_datetime": { "S": "20201001125959101" }, ":sym": { "S": "BTC" } }'
\ >
--endpoint-url http://localhost:8000 { "Items":
[ { "bid4_size":
{ "N":
"133" }, "ask3_size":
{ "N":
"23" }, "sym":
{ "S":
"BTC" }, "bid1_size":
{ "N":
"233" }, "ask5":
{ "N":
"104" }, "ask2":
{ "N":
"101" }, "bid2_size":
{ "N":
"3112" }, "ask1":
{ "N":
"100.5" }, "ask2_size":
{ "N":
"3" }, "ask5_size":
{ "N":
"233" }, "ask1_size":
{ "N":
"2" }, "ask4":
{ "N":
"103" }, "bid5":
{ "N":
"95" }, "bid5_size":
{ "N":
"54" }, "ask3":
{ "N":
"102" }, "feed_datetime":
{ "S":
"20201001125959101" }, "bid3":
{ "N":
"97" }, "ask4_size":
{ "N":
"32" }, "bid4":
{ "N":
"96" }, "bid1":
{ "N":
"99" }, "bid2":
{ "N":
"98" }, "bid3_size":
{ "N":
"20" } } ], "Count":
1, "ScannedCount":
1, "ConsumedCapacity":
null } |
テスト終わったので消します
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
(py37b)
Macico:kuloko macico$ aws dynamodb delete-table
\ > --table-name Quote
\ > --endpoint-url http://localhost:8000 { "TableDescription":
{ "AttributeDefinitions":
[ { "AttributeName":
"feed_datetime", "AttributeType":
"S" }, { "AttributeName":
"sym", "AttributeType":
"S" } ], "TableName":
"Quote", "KeySchema":
[ { "AttributeName":
"sym", "KeyType":
"HASH" }, { "AttributeName":
"feed_datetime", "KeyType":
"RANGE" } ], "TableStatus":
"ACTIVE", "CreationDateTime":
1603587197.54, "ProvisionedThroughput":
{ "LastIncreaseDateTime":
0.0, "LastDecreaseDateTime":
0.0, "NumberOfDecreasesToday":
0, "ReadCapacityUnits":
5, "WriteCapacityUnits":
5 }, "TableSizeBytes":
430, "ItemCount":
2, "TableArn":
"arn:aws:dynamodb:ddblocal:000000000000:table/Quote" } } |
ブラウザでチェック
いまendpointをlocalhost:8080にしているので、
|
1 |
http://localhost:8000/shell/ |
をお手待ちのブラウザで開くといい感じの画面出る。↑で叩いたようなクエリをJSで書いて叩けば帰ってくる。
AWS上に作りたい
そうですね作りたいですね。
まだなので、メモ程度にリンクはります
参考
1





