1

pycassa を使用して cassandra にデータを挿入する際に、エンコードの問題が発生します。フィールド名は「テキスト」で、コンテンツは非ASCII文字を含むツイートです。テキスト フィールドを encode('UTF-8') を使用してエンコードしようとすると、'unicode' から 'str' に変換されて表示されますが、それでも失敗しますか? 正確なエラーはこちら、

-'ascii' codec can't encode character u'\xbf' in position 0: ordinal not in range(128).
-'ascii' codec can't encode character u'\2026' in position 139: ordinal not in range(128).

編集 1: これが Cassandra で失敗しているフィールドの場合、デフォルトのバリデータ型が定義されていませんか? それは問題になるでしょうか?タイプが指定されていない場合、カサンドラはそれを何として保存しますか?

EDIT 2: これは EDIT 1 に答えます。何かに気づきました。失敗しているフィールドにはデフォルトの型が定義されておらず、doc に従って、cassandra はそれを Hex バイト配列 (ByteType) として保存しようとしますが、UTF を挿入しようとしています。 8 エンコードされた文字列、これは問題でしょうか?

トレースバック:

トレースバック (最新の呼び出しが最後): ファイル "/opt/socialflow/prod/api-reporting/api-reporting/CassFH/app/c.py"、40 行目、送信 Mutator.send(self, *a, ** kw) ファイル "/usr/local/lib/python2.6/dist-packages/pycassa/batch.py​​"、126 行目、送信 allow_retries=self.allow_retries)

ファイル "/usr/local/lib/python2.6/dist-packages/pycassa/pool.py"、124 行目、new_f result = f(self, *args, **kwargs)
ファイル "/usr/local/lib /python2.6/dist-packages/pycassa/cassandra/Cas​​sandra.py"、1005 行目、batch_mutate の self.send_batch_mutate(mutation_map、consistency_level)
ファイル "/usr/local/lib/python2.6/dist-packages/pycassa/ cassandra/Cas​​sandra.py」、1013 行、send_batch_mutate args.write(self._oprot)
ファイル「/usr/local/lib/python2.6/dist-packages/pycassa/cassandra/Cas​​sandra.py」、5200 行oprot.trans.write(fastbinary.encode_binary(self, (self. class , self.thrift_spec))))UnicodeEncodeError: 'ascii' コーデックは位置 0 の文字 u'\xbf' をエンコードできません: 序数が範囲内にありません (128 )[2013-05-20 21:31:14、450] ルートクリティカル:

4

1 に答える 1

-2

この問題は修正されました。ということで、本題でした。

  • エンコードの問題は、ツイート テキストと呼ばれる同じフィールドのいくつかの列ファミリに存在し、ASCII 以外の文字を含めることができます。
  • pycassa Mutator を使用して、複数の列ファミリーにまたがるリクエストをバッチ処理しました
  • そのため、2 つの列ファミリのエンコードの問題を修正しましたが、残りの 3 つの CF については修正できませんでした。
  • したがって、Pycassa バッチで 1 に対して失敗したため、バッチ挿入はすべて失敗します。
  • Python pycassa のドキュメントと cassandra データ モデルを 3 回よく読むことをお勧めします。

それがあなたのすべてを助けることを願っています。

于 2013-05-22T17:14:05.893 に答える