現在、PartitionKey を使用して、データを Azure Table Services に格納しているデバイスを区別しています。そのデータを参照できるビューアーを構築したいのですが、「デバイスごと」または PartitionKey ごとにデータを表示できるように構造化できると便利です。ビューアー アプリは、どのデバイスが存在するかを認識していないため、特定のテーブル内の個別のパーティション キーのリストを何らかの方法で取得できれば素晴らしいことです。これは可能ですか?それとも、デバイスごとに新しい行を挿入するメタデータ テーブルを作成し、それをクエリに使用することになりますか?
5 に答える
パーティションを格納する単一のテーブルを作成します。使用するテーブル名でテーブルを分割し、作成する各パーティションのエントリを追加します。
public class PartitionEntry : TableServiceEntity { }
tableServiceContext.AddObject("TablePartitions", new PartitionEntry
{
PartitionKey = "<table name>",
RowKey = "<partition key>",
});
tableServiceContext.BeginSaveChanges(SaveChangesOptions.ContinueOnError, null, null);
次に、このテーブルにクエリを実行して、パーティションのリストを取得します。これは私にとって非常に扱いやすいです。
var tbl = tableServiceContext.CreateQuery<PartitionEntry>("TablePartitions");
return tbl.Where(i => i.PartitionKey == "<table name>")
.Select(i => new { PartitionKey = i.RowKey, });
これは最適化できると思います。
すべてのパーティション キーを取得する方法はないと思います。ただし、巧妙な回避策は次のとおりです。
Avkash のブログから引用するには:
さらに調べてみると、パーティション キーのリストを取得するための API が組み込まれていないことがわかりました。代わりに、自分でソリューションを作成する必要があります。そのため、各パーティションに 1 つのダミー行を挿入することになり、パーティション キーのリストを取得したい場合は、それらのダミー項目を照会するだけで、探していたリストが得られました。
既にこれを見たことがあると思いますが、この質問に遭遇する可能性のある他の人にとっては、これがテーブル サービス機能の最良のガイドだと思います: http://azure.microsoft.com/en-us/documentation/articles /storage-dotnet-how-to-use-tables/には、例と詳細な API ドキュメントへのリンクが含まれています。
残念ながら、Azure テーブルには、distinct などの機能はありません。メモリ内のディクショナリのような構造化されたキー ベースのストレージと考えてください。実行する操作はすべて、最初にロードしてそのサブリストを処理するキーがわからない限り、それらのサブセットを取得するためにすべてのアイテムを反復処理する必要があります。
個人的には、単純に 2 つ目の Azure テーブルを使用し、そこに (行キーとして) パーティション キーを格納します。これにより、これらを別の要素でグループ化する機会が得られます。または、この 2 番目のテーブルに 1 つのパーティション キーを使用します。
これにより、最高のパフォーマンスが得られ、頭痛が最小限に抑えられます。
仕事をやり遂げることができるので、最も単純なアプローチが最善の方法である場合があります。
お役に立てれば、
私は前に同様のアプローチを試みました:
TableQuery queryRows = new TableQuery() { SelectColumns = new List<string> { "PartitionKey" } };
...
var tableClientSrc = storageAcctScr.CreateCloudTableClient();
var tablesSrc = tableClientSrc.ListTables();
var tableSrc = tablesSrc.FirstOrDefault(o => o.Name.Equals(nameSrc));
int cntSrc = tableSrc.ExecuteQuery(queryRows).Count();
...
アッパーとあなたのものは、大規模(7000万行のテーブルで実行 - 約2時間)または中規模で非常に遅くなりますが、多くのプロパティテーブルがあります