1

Python SDK を使用して Google Cloud Bigtable で複数のプレフィックスによる検索を実行しようとしています。を使用してread_rowsいますが、接頭辞で明示的に検索する良い方法がわかりません。

私の最初のオプションはRowSet+RowRangeです。3 つのクエリをテストしていますが、得られる時間は次のとおりです。~1.5 秒、~3.5 秒、~4.2 秒。これは、Node SDK (フィルター オプションがある) を使用した検索よりも桁違いに遅いです。~0.19、~0.13、~0.46。

2 番目のオプションはRowFilterChain+を使用することRowKeyRegexFilterです。次の 2 つのクエリのパフォーマンスはひどいものです。~3.1秒、~70秒、~75秒~0.124 秒、~72 秒、~69 秒。フルスキャンを行っているようです。これはコードセクションです:

            regex = f'^{prefix}.*'.encode()
            filters.append(RowKeyRegexFilter(regex)) 

3 番目のオプションは、プレフィックス フィルタリングを備えた別の Happybase ベースの SDK を使用することです。それで、私は得ています~36秒、~3秒、~1秒~0.4、~0.1、~0.17。最初のクエリには複数のプレフィックスが含まれており、同じリクエストで複数のフィルタリングをサポートしていないようです。そのため、プレフィックスと同じ数のリクエストを実行し、イテレータを連結しています。他の 2 つは、プレフィックス フィルターを利用しているようです。

UPDATE : 環境に誤りがあったため、最初は削除しました。適切に実行した後、範囲クエリの時間は悪くありませんが、接頭辞検索を利用すると Happybase テストはさらに高速になるため、改善の余地があるようです。

Happybase での複数のプレフィックス検索、またはメインの Python SDK での実際のプレフィックス検索の使用について助けていただければ幸いです。

4

1 に答える 1

3

このread_rowsメソッドには 2 つのパラメーターがstart_keyあり、行キーに基づいて行を効率的end_keyにフィルター処理するために使用できます ( docsを参照)。このメソッドはバックグラウンドで Scan を実行するため、行キーに基づいて行をフィルター処理するには、おそらくこれが最も効率的な方法です。

たとえば、テーブルに次の行キーがあるとします。

a
aa
b
bb
bbb

で始まる行キーを持つすべての行を取得したい場合はa、次を実行できます。

rows_with_prefix_a = my_table.read_rows(start_key="a", end_key="b")

aこれはとb(除外)の間の行のみをスキャンするbため、行キーの接頭辞a(前の例ではaand ) を持つすべての行が返されます。aa

于 2019-05-28T10:44:30.860 に答える