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