集計操作を実行して、最小値、最大値、合計値、平均値、行数、および行の個別カウントを取得できます。また、集計操作を実行して、フィールド値、範囲、地理的な場所、またはフィルター別に結果をグループ化し、ネストされたクエリを実行することもできます。複雑なクエリに対して複数の集計操作を実行できます。
Python V5.2.1以降向けのTablestore SDKは、集計機能をサポートしています。
背景情報
次の表は、集計方法について説明しています。
方法 | 説明 |
最小値 | フィールドの最小値を返すために使用できる集計方法です。この方法は、SQLのMIN関数と同様の方法で使用できます。 |
最大値 | フィールドの最大値を返すために使用できる集計方法です。この方法は、SQLのMAX関数と同様の方法で使用できます。 |
合計 | 数値フィールドのすべての値の合計を返すために使用できる集計方法です。この方法は、SQLのSUM関数と同様の方法で使用できます。 |
平均値 | 数値フィールドのすべての値の平均を返すために使用できる集計方法です。この方法は、SQLのAVG関数と同様の方法で使用できます。 |
カウント | 指定されたフィールドの値の総数、または検索インデックス内の行の総数を返すために使用できる集計方法です。この方法は、SQLのCOUNT関数と同様の方法で使用できます。 |
個別カウント | フィールドの個別値の数を返すために使用できる集計方法です。この方法は、SQLのCOUNT(DISTINCT)関数と同様の方法で使用できます。 |
パーセンタイル統計 | パーセンタイル値は、データセット内の値の相対的な位置を示します。たとえば、システムの日常的なO&M中に各リクエストの応答時間に関する統計を収集する場合、p25、p50、p90、p99などのパーセンタイルを使用して応答時間の分布を分析する必要があります。 |
フィールド値によるグループ化 | フィールド値に基づいてクエリ結果をグループ化するために使用できる集計方法です。同じ値は一緒にグループ化されます。各グループの同一の値と、各グループ内の同一の値の数が返されます。 説明 グループ内の値の数が非常に大きい場合、計算された数は実際の数と異なる場合があります。 |
範囲によるグループ化 | フィールドの値の範囲に基づいてクエリ結果をグループ化するために使用できる集計方法です。指定された範囲内にあるフィールド値は一緒にグループ化されます。各範囲内の値の数が返されます。 |
地理的な場所によるグループ化 | 地理的な場所から中心点までの距離に基づいてクエリ結果をグループ化するために使用できる集計方法です。指定された範囲内にある距離のクエリ結果は一緒にグループ化されます。各範囲内の項目数が返されます。 |
フィルターによるグループ化 | クエリ結果をフィルタリングし、各フィルターに基づいてグループ化して、一致する結果の数を取得するために使用できる集計方法です。結果は、フィルターが指定された順序で返されます。 |
ヒストグラムによるクエリ | この集計方法は、特定のデータ間隔に基づいてクエリ結果をグループ化するために使用できます。同じ範囲内にあるフィールド値は一緒にグループ化されます。各グループの値の範囲と、各グループ内の値の数が返されます。 |
前提条件
OTSClientインスタンスが初期化されていること。詳細については、OTSClientインスタンスの初期化を参照してください。
データテーブルが作成され、データがデータテーブルに書き込まれていること。詳細については、データテーブルの作成とデータの書き込みを参照してください。
データテーブルの検索インデックスが作成されていること。詳細については、検索インデックスの作成を参照してください。
最小値
フィールドの最小値を返すために使用できる集計方法です。この方法は、SQLのMIN関数と同様の方法で使用できます。
パラメーター
パラメーター
説明
name
集計操作の一意の名前。この名前を使用して、特定の集計操作の結果をクエリできます。
field
集計操作を実行するために使用されるフィールドの名前。LONG、DOUBLE、およびDATE型のみがサポートされています。
missing
フィールド値が空の場合に、行に対して集計操作を実行するために使用されるフィールドのデフォルト値。
missingの値を指定しない場合、行は無視されます。
missingの値を指定した場合、このパラメーターの値が行のフィールド値として使用されます。
例
次のコードは、集計を使用して18歳の人々のスコアから最低スコアを取得する方法の例を示しています。
query = TermQuery('age', 18) agg = Min('score', name = 'min') search_response = client.search(table_name, index_name, SearchQuery(query, next_token = None, limit=0, aggs=[agg]), columns_to_get = ColumnsToGet(return_type = ColumnReturnType.ALL_FROM_INDEX)) for agg_result in search_response.agg_results: print('{\n"name":"%s",\n"value":%s\n}\n' % (agg_result.name, str(agg_result.value)))
最大値
フィールドの最大値を返すために使用できる集計方法です。この方法は、SQLのMAX関数と同様の方法で使用できます。
パラメーター
パラメーター
説明
name
集計操作の一意の名前。この名前を使用して、特定の集計操作の結果をクエリできます。
field
集計操作を実行するために使用されるフィールドの名前。LONG、DOUBLE、およびDATE型のみがサポートされています。
missing
フィールド値が空の場合に、行に対して集計操作を実行するために使用されるフィールドのデフォルト値。
missingの値を指定しない場合、行は無視されます。
missingの値を指定した場合、このパラメーターの値が行のフィールド値として使用されます。
例
次のコードは、集計を使用して18歳の人々のスコアから最高スコアを取得する方法の例を示しています。デフォルトでは、人がスコアを持っていない場合、集計のスコアとして値0が使用されます。
query = TermQuery('age', 18) agg = Max('score', missing_value = 0, name = 'max') search_response = client.search(table_name, index_name, SearchQuery(query, next_token = None, limit=0, aggs=[agg]), columns_to_get = ColumnsToGet(return_type = ColumnReturnType.ALL_FROM_INDEX)) for agg_result in search_response.agg_results: print('{\n"name":"%s",\n"value":%s\n}\n' % (agg_result.name, str(agg_result.value)))
合計
数値フィールドのすべての値の合計を返すために使用できる集計方法です。この方法は、SQLのSUM関数と同様の方法で使用できます。
パラメーター
パラメーター
説明
name
集計操作の一意の名前。この名前を使用して、特定の集計操作の結果をクエリできます。
field
集計操作を実行するために使用されるフィールドの名前。LONG型とDOUBLE型のみがサポートされています。
missing
フィールド値が空の場合に、行に対して集計操作を実行するために使用されるフィールドのデフォルト値。
missingの値を指定しない場合、行は無視されます。
missingの値を指定した場合、このパラメーターの値が行のフィールド値として使用されます。
例
次のコードは、集計を使用して18歳の人々のスコアの合計を取得する方法の例を示しています。
query = TermQuery('age', 18) agg = Sum('score', name = 'sum') search_response = client.search(table_name, index_name, SearchQuery(query, next_token = None, limit=2, aggs=[agg]), columns_to_get = ColumnsToGet(return_type = ColumnReturnType.ALL_FROM_INDEX)) for agg_result in search_response.agg_results: print('{\n"name":"%s",\n"value":%s\n}\n' % (agg_result.name, str(agg_result.value)))
平均値
数値フィールドのすべての値の平均を返すために使用できる集計方法です。この方法は、SQLのAVG関数と同様の方法で使用できます。
パラメーター
パラメーター
説明
name
集計操作の一意の名前。この名前を使用して、特定の集計操作の結果をクエリできます。
field
集計操作を実行するために使用されるフィールドの名前。LONG、DOUBLE、およびDATE型のみがサポートされています。
missing
フィールド値が空の場合に、行に対して集計操作を実行するために使用されるフィールドのデフォルト値。
missingの値を指定しない場合、行は無視されます。
missingの値を指定した場合、このパラメーターの値が行のフィールド値として使用されます。
例
次のコードは、集計を使用して18歳の人々の平均スコアを取得する方法の例を示しています。
query = TermQuery('age', 18) agg = Avg('score', name = 'avg') search_response = client.search(table_name, index_name, SearchQuery(query, next_token = None, limit=2, aggs=[agg]), columns_to_get = ColumnsToGet(return_type = ColumnReturnType.ALL_FROM_INDEX)) for agg_result in search_response.agg_results: print('{\n"name":"%s",\n"value":%s\n}\n' % (agg_result.name, str(agg_result.value)))
カウント
指定されたフィールドの値の総数、または検索インデックス内の行の総数を返すために使用できる集計方法です。この方法は、SQLのCOUNT関数と同様の方法で使用できます。
検索インデックス内の行の総数、またはクエリ条件を満たす行の総数をクエリするには、次の方法を使用できます。
集計のcount機能を使用し、リクエストでcount(*)を指定します。
クエリ機能を使用して、クエリ条件を満たす行の数を取得します。クエリでsetGetTotalCountをtrueに設定します。MatchAllQueryを使用して、検索インデックス内の行の総数を取得します。
列の名前をcount式の値として使用して、検索インデックスに列が含まれる行の数をクエリできます。この方法は、スパース列を含むシナリオに適しています。
パラメーター
パラメーター
説明
name
集計操作の一意の名前。この名前を使用して、特定の集計操作の結果をクエリできます。
field
集計操作を実行するために使用されるフィールドの名前。LONG、DOUBLE、BOOLEAN、KEYWORD、GEO_POINT、およびDATE型のみがサポートされています。
例
次のコードは、集計を使用してスコアを持つ18歳の人々の数を取得する方法の例を示しています。
query = TermQuery('age', 18) agg = Count('score', name = 'count') search_response = client.search(table_name, index_name, SearchQuery(query, next_token = None, limit=2, aggs=[agg]), columns_to_get = ColumnsToGet(return_type = ColumnReturnType.ALL_FROM_INDEX)) for agg_result in search_response.agg_results: print('{\n"name":"%s",\n"value":%s\n}\n' % (agg_result.name, str(agg_result.value)))
個別カウント
フィールドの個別値の数を返すために使用できる集計方法です。この方法は、SQLのCOUNT(DISTINCT)関数と同様の方法で使用できます。
個別値の数は概算です。
個別カウント機能を使用する前の行の総数が10,000未満の場合、計算結果は正確な値に近くなります。
個別カウント機能を使用する前の行の総数が1億以上の場合、エラー率は約2%です。
パラメーター
パラメーター
説明
name
集計操作の一意の名前。この名前を使用して、特定の集計操作の結果をクエリできます。
field
集計操作を実行するために使用されるフィールドの名前。LONG、DOUBLE、BOOLEAN、KEYWORD、GEO_POINT、およびDATE型のみがサポートされています。
missing
フィールド値が空の場合に、行に対して集計操作を実行するために使用されるフィールドのデフォルト値。
missingの値を指定しない場合、行は無視されます。
missingの値を指定した場合、このパラメーターの値が行のフィールド値として使用されます。
例
次のコードは、集計を使用して18歳の人々の一意の名前の数を取得する方法の例を示しています。
query = TermQuery('age', 18) agg = DistinctCount('name', name = 'distinct_name') search_response = client.search(table_name, index_name, SearchQuery(query, next_token = None, limit=2, aggs=[agg]), columns_to_get = ColumnsToGet(return_type = ColumnReturnType.ALL_FROM_INDEX)) for agg_result in search_response.agg_results: print('{\n"name":"%s",\n"value":%s\n}\n' % (agg_result.name, str(agg_result.value)))
パーセンタイル統計
パーセンタイル値は、データセット内の値の相対的な位置を示します。たとえば、システムの日常的なO&M中に各リクエストの応答時間に関する統計を収集する場合、p25、p50、p90、p99などのパーセンタイルを使用して応答時間の分布を分析する必要があります。
パラメーター
パラメーター
説明
name
集計操作の一意の名前。この名前を使用して、特定の集計操作の結果をクエリできます。
field
集計操作を実行するために使用されるフィールドの名前。LONG、DOUBLE、およびDATE型のみがサポートされています。
percentiles
p50、p90、p99などのパーセンタイル。1つ以上のパーセンタイルを指定できます。
missing_value
フィールド値が空の場合に、行に対して集計操作を実行するために使用されるフィールドのデフォルト値。
missing_valueの値を指定しない場合、行は無視されます。
missing_valueの値を指定した場合、このパラメーターの値が行のフィールド値として使用されます。
例
query = TermQuery('product', '10010') agg = Percentiles('latency', percentiles_list = [50, 90, 95]) search_response = client.search(table_name, index_name, SearchQuery(query, next_token = None, limit=2, aggs=[agg]), columns_to_get = ColumnsToGet(return_type = ColumnReturnType.ALL_FROM_INDEX)) for agg_result in search_response.agg_results: print('percentiles:%s' % agg_result.name) for item in agg_result.value: print('%s:%s' % (str(item.key), str(item.value)))
フィールド値によるグループ化
フィールド値に基づいてクエリ結果をグループ化するために使用できる集計方法です。同じ値は一緒にグループ化されます。各グループの同一の値と、各グループ内の同一の値の数が返されます。
グループ内の値の数が非常に大きい場合、計算された数は実際の数と異なる場合があります。
パラメーター
パラメーター
説明
name
集計操作の一意の名前。この名前を使用して、特定の集計操作の結果をクエリできます。
field
集計操作を実行するために使用されるフィールドの名前。LONG、DOUBLE、BOOLEAN、KEYWORD、およびDATE型のみがサポートされています。
size
返されるグループの数。デフォルト値:10。最大値:2000。グループの数が2,000を超える場合、最初の2,000グループのみが返されます。
group_by_sort
グループのソート規則。デフォルトでは、グループはグループ内の項目数に基づいて降順にソートされます。複数のソート規則を設定した場合、グループは規則が設定された順序でソートされます。サポートされているパラメーター:
値でアルファベット順にソートします。
値でアルファベットの逆順にソートします。
行数で昇順にソートします。
行数で降順にソートします。
サブ集計結果から取得された値で昇順にソートします。
サブ集計結果から取得された値で降順にソートします。
sub_aggs and sub_group_bys
サブ集計操作。グループ化結果に基づいてサブ集計操作を実行できます。
シナリオ
各カテゴリの製品数、および各カテゴリの製品の最高価格と最低価格をクエリします。
方法
製品カテゴリ別にクエリ結果をグループ化して、各カテゴリの製品数を取得します。次に、2つのサブ集計操作を実行して、各カテゴリの製品の最高価格と最低価格を取得します。
結果例
果物:5。最高価格は15人民元。最低価格は3人民元。
トイレタリー:10。最高価格は98人民元。最低価格は1人民元。
電子機器:3。最高価格は8,699人民元。最低価格は2,300人民元。
その他の製品:15。最高価格は1,000人民元。最低価格は80人民元。
例1
次のコードは、18歳の人々をスコア別にグループ化し、上位10個の共通スコアと各グループの人数を取得する方法の例を示しています。
query = TermQuery('age', 18) group_by = GroupByField('score', size = 10) search_response = client.search(table_name, index_name, SearchQuery(query, next_token = None, limit=20, group_bys = [group_by]), columns_to_get = ColumnsToGet(return_type = ColumnReturnType.ALL_FROM_INDEX)) for group_by in search_response.group_by_results: print("name:%s" % group_by.name) print("groups:") for item in group_by.items: print("key:%s, count:%d" % (item.key, item.row_count))
例2
次のコードは、18歳の人々をスコア別にグループ化し、2つの最も少ない共通スコアと各グループの人数を取得する方法の例を示しています。
group_by = GroupByField('score', size = 2, group_by_sort = [RowCountSort(sort_order=SortOrder.ASC)]) search_response = client.search(table_name, index_name, SearchQuery(TermQuery('age', 18), limit=100, get_total_count=True, group_bys = [group_by]), ColumnsToGet(return_type=ColumnReturnType.ALL_FROM_INDEX)) for group_by in search_response.group_by_results: print("name:%s" % group_by.name) print("groups:") for item in group_by.items: print("key:%s, count:%d" % (item.key, item.row_count))
例3
次のコードは、18歳の人々をスコア別にグループ化し、上位2つの共通スコアと各グループの人数を取得する方法の例を示しています。次に、各グループの人々を主キーでソートし、各グループの上位3人の情報を取得します。
sort = RowCountSort(sort_order = SortOrder.DESC) sub_agg = [TopRows(limit=3,sort=Sort([PrimaryKeySort(sort_order=SortOrder.DESC)]), name = 't1')] group_by = GroupByField('l', size = 2, group_by_sort = [sort], sub_aggs = sub_agg) search_response = client.search(table_name, index_name, SearchQuery(TermQuery('age', 18), limit=100, get_total_count=True, group_bys = [group_by]), ColumnsToGet(return_type=ColumnReturnType.ALL_FROM_INDEX)) for group_by in search_response.group_by_results: print("name:%s" % group_by.name) print("groups:") for item in group_by.items: print("\tkey:%s, count:%d" % (item.key, item.row_count)) for sub_agg in item.sub_aggs: print("\t\tname:%s:" % sub_agg.name) for entry in sub_agg.value: print("\t\t\tvalue:%s" % str(entry))
例4
次のコードは、18歳の人々をスコアと性別でグループ化する方法の例を示しています。
sort = RowCountSort(sort_order = SortOrder.ASC) sub_group = GroupByField('sex', size = 10, group_by_sort = [sort]) group_by = GroupByField('score', size = 10, group_by_sort = [sort], sub_group_bys = [sub_group]) search_response = client.search(table_name, index_name, SearchQuery(TermQuery('age', 18), limit=100, get_total_count=True, group_bys = [group_by]), ColumnsToGet(return_type=ColumnReturnType.ALL_FROM_INDEX)) for group_by in search_response.group_by_results: print("name:%s" % group_by.name) print("groups:") for item in group_by.items: print("\tkey:%s, count:%d" % (item.key, item.row_count)) for sub_group in item.sub_group_bys: print("\t\tname:%s:" % sub_group.name) for sub_item in sub_group.items: print("\t\t\tkey:%s, count:%s" % (str(sub_item.key), str(sub_item.row_count)))
範囲によるグループ化
フィールドの値の範囲に基づいてクエリ結果をグループ化するために使用できる集計方法です。指定された範囲内にあるフィールド値は一緒にグループ化されます。各範囲内の値の数が返されます。
パラメーター
パラメーター
説明
name
集計操作の一意の名前。この名前を使用して、特定の集計操作の結果をクエリできます。
field
集計操作を実行するために使用されるフィールドの名前。LONG型とDOUBLE型のみがサポートされています。
range[double_from, double_to)
グループ化の値の範囲。
値の範囲はDouble.MIN_VALUEから開始し、Double.MAX_VALUEで終了できます。
sub_aggs and sub_group_bys
サブ集計操作。グループ化結果に基づいてサブ集計操作を実行できます。
たとえば、売上高と州別にクエリ結果をグループ化した後、指定された範囲内で売上高の割合が最も大きい州を取得できます。このクエリを実行するには、GroupByRangeでGroupByFieldの値を指定する必要があります。
例
次のコードは、18歳の人々をスコア範囲別にグループ化し、
[80, 90)
と[90, 100)
の間隔でスコアを持つ人々の数を取得する方法の例を示しています。query = TermQuery('age', 18) group_by = GroupByRange(field_name = 'score', ranges = [(80, 90),(90, 100)]) search_response = client.search(table_name, index_name, SearchQuery(query, next_token = None, limit=0, group_bys = [group_by]), columns_to_get = ColumnsToGet(return_type = ColumnReturnType.ALL_FROM_INDEX)) for group_by in search_response.group_by_results: print("name:%s" % group_by.name) print("groups:") for item in group_by.items: print("range:%.1f~%.1f, count:%d" % (item.range_from, item.range_to, item.row_count))
地理的な場所によるグループ化
地理的な場所から中心点までの距離に基づいてクエリ結果をグループ化するために使用できる集計方法です。指定された範囲内にある距離のクエリ結果は一緒にグループ化されます。各範囲内の項目数が返されます。
パラメーター
パラメーター
説明
name
集計操作の一意の名前。この名前を使用して、特定の集計操作の結果をクエリできます。
field
集計操作に使用されるフィールドの名前。GEOPOINT型のみがサポートされています。
origin(double lat, double lon)
中心点の経度と緯度。
latは中心点の緯度を指定します。lonは中心点の経度を指定します。
range[double_from, double_to)
グループ化に使用される距離範囲。単位:メートル。
値の範囲はDouble.MIN_VALUEから開始し、Double.MAX_VALUEで終了できます。
sub_aggs and sub_group_bys
サブ集計操作。グループ化結果に基づいてサブ集計操作を実行できます。
例
次のコードは、18歳の人々を学校から自宅までの地理的距離でグループ化し、学校から1キロメートル以内に住んでいる人々と学校から1〜2キロメートル離れて住んでいる人々の数を取得する方法の例を示しています。学校の緯度と経度は(31,116)です。
query = TermQuery('age', 18) group_by = GroupByGeoDistance(field_name = 'address', origin=GeoPoint(31, 116), ranges = [(0, 1000), (1000,2000)]) search_response = client.search(table_name, index_name, SearchQuery(query, next_token = None, limit=2, group_bys = [group_by]), columns_to_get = ColumnsToGet(return_type = ColumnReturnType.ALL_FROM_INDEX)) for group_by in search_response.group_by_results: print("name:%s" % group_by.name) print("groups:") for item in group_by.items: print("range:%.1f~%.1f, count:%d" % (item.range_from, item.range_to, item.row_count))
フィルターによるグループ化
クエリ結果をフィルタリングし、各フィルターに基づいてグループ化して、一致する結果の数を取得するために使用できる集計方法です。結果は、フィルターが指定された順序で返されます。
パラメーター
パラメーター
説明
name
集計操作の一意の名前。この名前を使用して、特定の集計操作の結果をクエリできます。
filter
クエリに使用できるフィルター。結果は、フィルターが指定された順序で返されます。
sub_aggs and sub_group_bys
サブ集計操作。グループ化結果に基づいてサブ集計操作を実行できます。
例
次のコードは、18歳の人々をフィルター別にグループ化し、数学の試験で100点を取った人々と中国語の試験で100点を取った人々の数を取得する方法の例を示しています。
query = TermQuery('age', 18) filter1 = TermQuery('math', 100) filter2 = TermQuery('chinese', 100) filters = [filter1, filter2] group_by = GroupByFilter(filters) search_response = client.search( table_name, index_name, SearchQuery(query, next_token = None, limit=2, group_bys = [group_by]), columns_to_get = ColumnsToGet(return_type = ColumnReturnType.ALL_FROM_INDEX)) for group_by in search_response.group_by_results: print("name:%s" % group_by.name) print("groups:") i = 0 for item in group_by.items: print("filter:%s=%s, count:%d" % (str(filters[i].field_name), str(filters[i].column_value), item.row_count)) i=i+1
ヒストグラムによるクエリ
この集計方法は、特定のデータ間隔に基づいてクエリ結果をグループ化するために使用できます。同じ範囲内にあるフィールド値は一緒にグループ化されます。各グループの値の範囲と、各グループ内の値の数が返されます。
パラメーター
パラメーター
説明
name
集計操作の一意の名前。この名前を使用して、特定の集計操作の結果をクエリできます。
field
集計操作を実行するために使用されるフィールドの名前。LONG型とDOUBLE型のみがサポートされています。
interval
集計結果を取得するために使用されるデータ間隔。
field_range[min,max]
intervalパラメーターと共に使用してグループの数を制限する範囲。
式を使用して計算された値は2,000を超えることはできません。
min_doc_count
行の最小数。グループ内の行数が行の最小数よりも少ない場合、グループの集計結果は返されません。
missing_value
フィールド値が空の場合に、行に対して集計操作を実行するために使用されるフィールドのデフォルト値。
missing_valueの値を指定しない場合、行は無視されます。
missing_valueの値を指定した場合、このパラメーターの値が行のフィールド値として使用されます。
例
query = TermQuery('product', '10010') group_by = GroupByHistogram(field_name = 'latency', interval = 100, field_range = FieldRange(0, 10000), missing_value = 0) search_response = client.search(table_name, index_name, SearchQuery(query, next_token = None, limit=2, group_bys = [group_by]), columns_to_get = ColumnsToGet(return_type = ColumnReturnType.ALL_FROM_INDEX)) for group_by in search_response.group_by_results: print("name:%s" % group_by.name) print("groups:") for item in group_by.items: print("%s:%s" % (item.key, item.value))