none
WASSのTableでNextPartitionKey,NextRowKeyの取得、指定について RRS feed

  • 質問

  • こんにちは、はじめて投稿させていただきます。
    hanenaoと申します。

    現在、Windows Azure上に配置したアプリケーションのログを取得しようと「WADLogsTable」からデータを取得しようとしています。
    また、データは膨大な量であるため、一度では取得できず、NextPartitionKey,NextRowKeyを使用していくつかに分けて取得しています。
    実装するにあたり、デバッグをしていると仕様が不可解な部分があったため質問を上げさせていただきました。
    データ取得は問題ないのですが、HTTPヘッダからNextPartitionKey,NextRowKeyを取得すると以下のような値が取得されます。

    "x-ms-continuation-NextPartitionKey":"1!28!MDYzNDA1NTE0MzIwMDAwMDAwMA--"
    "x-ms-continuation-NextRowKey":"1!108!NTFhOWQ5NzlhYTdmNGY5NjgzY2Y3MTY2MWJhYWJmMjFfX19CYXNlV2ViX19fQmFzZVdlYl9JTl8wX19fMDAwMDAwMDAwMTY1MjAzMTQ5NA--"
    返ってきた値は何かでエンコードされているように見えます。本来「WADLogsTable」では以下のようなPartitionKey,RowKeyが返ってくるはずだと思います。
    "x-ms-continuation-NextPartitionKey":"0634055207400000000"
    "x-ms-continuation-NextRowKey":"9a60262623d84a40b6bad98ecfe7766f___Worker___Worker_IN_0___0000000001652031490"

    NextPartitionKey,NextRowKeyがどのような仕様なのでしょうか?

    2010年4月21日 6:43

回答

  • hanenao さん、こんにちは。

    山本と申します。

     

    NextPartitionKey, NextRowKey がどのようにエンコードされるかの仕様は見つかりませんでしたが Base64 エンコーディングが元になっているものと思われます。

    最初の "1!" という部分の意味は不明ですが "!28" 及び "128!" という部分はそのあとの文字列のバイト数を表すものと思われます。

    さらに末尾の "-" を Base64 文字列の桁合わせのためのパディング文字列である、"=" とした Base64 文字列とみなしてデコードを行うと元の PartitionKey と RowKey が得られます。

    以下のようなコードで確認できます。

     

    C#:
    System.Text.Encoding.ASCII.GetString(Convert.FromBase64String("NTFhOWQ5NzlhYTdmNGY5NjgzY2Y3MTY2MWJhYWJmMjFfX19CYXNlV2ViX19fQmFzZVdlYl9JTl8wX19fMDAwMDAwMDAwMTY1MjAzMTQ5NA=="))
    
    >"51a9d979aa7f4f9683cf71661baabf21___BaseWeb___BaseWeb_IN_0___0000000001652031494"
    
    System.Text.Encoding.ASCII.GetString(Convert.FromBase64String("MDYzNDA1NTE0MzIwMDAwMDAwMA=="))
    
    >"0634055143200000000"

     正しい仕様は分からないのでエンコードやデコードは避けた方がよいと思いますが、参考になればと思います。 

    (A_Y)m

    • 回答としてマーク hanenao 2010年4月23日 0:14
    2010年4月22日 15:49

すべての返信

  • hanenao さん、こんにちは。

    山本と申します。

     

    NextPartitionKey, NextRowKey がどのようにエンコードされるかの仕様は見つかりませんでしたが Base64 エンコーディングが元になっているものと思われます。

    最初の "1!" という部分の意味は不明ですが "!28" 及び "128!" という部分はそのあとの文字列のバイト数を表すものと思われます。

    さらに末尾の "-" を Base64 文字列の桁合わせのためのパディング文字列である、"=" とした Base64 文字列とみなしてデコードを行うと元の PartitionKey と RowKey が得られます。

    以下のようなコードで確認できます。

     

    C#:
    System.Text.Encoding.ASCII.GetString(Convert.FromBase64String("NTFhOWQ5NzlhYTdmNGY5NjgzY2Y3MTY2MWJhYWJmMjFfX19CYXNlV2ViX19fQmFzZVdlYl9JTl8wX19fMDAwMDAwMDAwMTY1MjAzMTQ5NA=="))
    
    >"51a9d979aa7f4f9683cf71661baabf21___BaseWeb___BaseWeb_IN_0___0000000001652031494"
    
    System.Text.Encoding.ASCII.GetString(Convert.FromBase64String("MDYzNDA1NTE0MzIwMDAwMDAwMA=="))
    
    >"0634055143200000000"

     正しい仕様は分からないのでエンコードやデコードは避けた方がよいと思いますが、参考になればと思います。 

    (A_Y)m

    • 回答としてマーク hanenao 2010年4月23日 0:14
    2010年4月22日 15:49
  • 回答ありがとうございます。
    私も最初Base64だと疑ったのですが、「!」や「-」が使用されている時点で違うだろうなと思いました。
    やはり仕様は公開されていませんか。私も探したのですが見当たらなかったので。
    動作をみると、生でNextPartitionKey, NextRowKey を指定しても、エンコードされたものを指定してもちゃんと動作しているようなのでデコード等はしないで行ったほうが安全そうですね。

    hanenao

    2010年4月23日 0:13