1
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

Organization

オブジェクトストレージ Cloudian/S3 にあるJSON形式のデータから特定のデータを抽出してみます

はじめに

AWS SDK for Python(boto3) を使って、プログラムをほぼ変更せずに Cloudian と S3 へのアクセスが可能となります。オブジェクトストレージをハイブリッド(オンプレミス:Cloudian、AWS:S3)で使いたい方への参考になればと、、、

概要

オブジェクトストレージ Cloudian/S3 上のバケット名「boto3-cloudian」にあるJSON形式のデータファイルから特定のデータを抽出する Python プログラムです。

JSON形式のデータファイルは、これ で生成した「test-iot-dummy.json」となり、10万件のデータが存在しています。そのデータから、項目「section」=「R」のものを抽出し、そのデータ件数と抽出に掛かった時間を表示します。

抽出項目「section」はパラメータとして定義することも可能です(アルファベット大文字1文字)。プログラム実行時に、パラメータ「-h」を指定することにより表示されるヘルプも参照ください。

実行環境

macOS Big Sur 11.1
python 3.8.3

クレデンシャル情報の定義

今回はクレデンシャル情報を .zshenv に定義してプログラムを実行しています。接続先に合わせて定義ください。

# AWS S3
export AWS_ACCESS_KEY_ID=xxxxxxxxxxxxx
export AWS_SECRET_ACCESS_KEY=yyyyyyyyyyyyyyyyy
export AWS_DEFAULT_REGION=ap-northeast-1

# Cloudian
#export AWS_ACCESS_KEY_ID=aaaaaaaaaaaaaaaaaa
#export AWS_SECRET_ACCESS_KEY=bbbbbbbbbbbbbbbbbbbb
#export AWS_DEFAULT_REGION=pic

実行プログラム

Cloudianへアクセスする場合は endpoint_url を記載ください(プログラム内を参照ください)。

IoTSample-read.py

import json
import time
import argparse
import boto3

BUCKET_NAME = 'boto3-cloudian'
OBJECT_KEY = 'test-iot-dummy.json'


# S3-APIで全データ取得してロジックでフィルタ(項目:Section)
def section_main(section):

    # client = boto3.client('s3', endpoint_url='http://s3-pic.networld.local')    # Cloudianへのアクセス時
    client = boto3.client('s3')                                                 # S3へのアクセス時
    response = client.get_object(
        Bucket=BUCKET_NAME,
        Key=OBJECT_KEY
    )

    target = []
    if 'Body' in response:
        body = response['Body'].read()
        text = body.decode('utf-8')
        items = json.loads(text)
        items = items['items']
        target = list(filter(lambda x: x['section'] == section, items))
    # print(target)
    return len(target)


if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='IoT機器のなんちゃってダミーデータの抽出')
    parser.add_argument('--section', type=str, default='R', help='抽出するセクションの指定(アルファベット大文字1文字)')
    args = parser.parse_args()

    start = time.time()

    num = section_main(args.section)

    select_time = time.time() - start

    print("")
    print(f"データ抽出件数:{num}")
    print("抽出処理時間(通常_API):{0}".format(select_time) + " [sec]")
    print("")

プログラムの実行

最初にヘルプを表示してみます。

$ python IoTSample-read.py -h             
usage: IoTSample-read.py [-h] [--section SECTION]

IoT機器のなんちゃってダミーデータの抽出

optional arguments:
  -h, --help         show this help message and exit
  --section SECTION  抽出するセクションの指定(アルファベット大文字一文字)

では、デフォルトの抽出項目でデータ抽出を実行してみます。

$ python IoTSample-read.py

データ抽出件数:3929
抽出処理時間(通常_API):3.6708199977874756 [sec]

次に、抽出項目を指定した場合の実行です。

$ python IoTSample-read.py --section Z

データ抽出件数:3792
抽出処理時間(通常_API):3.5160200595855713 [sec]

まとめ

今回は、AWS SDK for Python(boto3) を使って、オブジェクトストレージ Cloudian / S3 からデータを抽出することを確認できました(10万件のデータから数秒で目的のデータを抽出完了(もちろん環境に依存します))。

Cloudianについては、ここ を確認ください。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
1
Help us understand the problem. What are the problem?