2

バルクローダーを使用して、あるGAEサーバーからレビューの種類をダウンロードし、別のGAEサーバーにアップロードしています。このレビューの種類には、約30,000のエンティティが含まれています。

次のコマンドを使用してアップロードします。

appcfg.py upload_data --kind=Review --filename=review.csv --application=<MY_APP_ID> --url=http://<MY_APP_ID>.appspot.com/remote_api --rps_limit=500 --bandwidth_limit=2500000 --batch_size=100

注:全体のエラーはかなり長いです。だから私はこの質問の最後にそれを含めました。

アップロードはまったく開始されず、次の行で停止します。[INFO ] Opening database: bulkloader-progress-20110611.222101.sql3

トレース全体の下部に表示されます。lambda val: _EPOCH + datetime.timedelta(microseconds=val), OverflowError: date value out of range

これは、私の公開日列にある不適切な形式の日付が原因であると思われます(レビューの種類全体については以下を参照してください)。


私がすでにそれを修正しようとしたこと

SELECT * FROM Review where publisheddate = nullGAE管理ポータルでGQL:を実行したところ、 publisheddate列にnull値を持つ約15のエンティティが見つかりました。そこで、それらを削除し、再ダウンロードして、レビューの種類を再アップロードしてみました。それでも同じエラーが発生します。

私は設定ファイルパラメータなしでuploadコマンドを使用しているので、私は考えています--config_file=bulkloader.yaml(例えば、私が指定していない上記のアップロードを参照してください--config_file

review.csvファイルに何がダウンロードされるかを判断するために、データストアの統計に依存しています。

nullのpublisheddateを持つエンティティを削除したので、この再ダウンロードとすぐの再アップロードは、最初のダウンロードとアップロードと何の違いもありません。データストアの統計はまだ更新されていないため。


私の質問

  1. 30、000のエンティティがあるため、日付の形式が正しくないエンティティを見つける方法がわかりません。公開日の値が悪いエンティティをすばやく見つけることはできますか?

  2. 誰かがこの問題を修正する方法を知っていますか?エラートレースから、実際の問題が何であるかはわかりません。


レビューの種類

objectify3.0.jarを使用してGAEデータストアを操作しています。したがって、私のレビューの種類は次のようになります。

public class Review {
    @Id private Long id; //This is my key property, auto generated by objectify  
    private String reviewlink;  
    private Date publisheddate;
    private double rating;      
    private Long gameid;    //to make querying easier

    //ommitting getters and setters 
}

エラー全体

10:20:48>appcfg.py upload_data --kind=Review --filename=review.csv --application=<MY_APP_ID> --url=http://<MY_APP_ID>.appspot.com/remote_api --rps_limit=500 --bandwidth_limit=2500000 --batch_size=100
Uploading data records.
[INFO    ] Logging to bulkloader-log-20110611.222101
[INFO    ] Throttling transfers:
[INFO    ] Bandwidth: 2500000 bytes/second
[INFO    ] HTTP connections: 8/second
[INFO    ] Entities inserted/fetched/modified: 500/second
[INFO    ] Batch Size: 100
[INFO    ] Opening database: bulkloader-progress-20110611.222101.sql3
Traceback (most recent call last):
  File "/usr/local/bin/appcfg.py", line 76, in <module>
    run_file(__file__, globals())
  File "/usr/local/bin/appcfg.py", line 72, in run_file
    execfile(script_path, globals_)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/appcfg.py", line 3592, in <module>
    main(sys.argv)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/appcfg.py", line 3583, in main
    result = AppCfgApp(argv).Run()
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/appcfg.py", line 2229, in Run
    self.action(self)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/appcfg.py", line 3368, in __call__
    return method()
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/appcfg.py", line 3195, in PerformUpload
    run_fn(args)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/appcfg.py", line 3087, in RunBulkloader
    sys.exit(bulkloader.Run(arg_dict))
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/bulkloader.py", line 4360, in Run
    return _PerformBulkload(arg_dict)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/bulkloader.py", line 4204, in _PerformBulkload
    loader.initialize(filename, loader_opts)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/bulkloader.py", line 2879, in initialize
    self.high_id_table = self._find_high_id(self.generate_records(filename))
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/bulkloader.py", line 2896, in _find_high_id
    for values in record_generator:
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/bulkloader.py", line 2920, in generate_records
    yield datastore.Entity._FromPb(fixed_entity_proto)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/datastore.py", line 958, in _FromPb
    value = datastore_types.FromPropertyPb(prop)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/datastore_types.py", line 1792, in FromPropertyPb
    value = conversion(value)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/datastore_types.py", line 1722, in <lambda>
    lambda val: _EPOCH + datetime.timedelta(microseconds=val),
OverflowError: date value out of range
4

1 に答える 1

1

問題のある行を見つける方法

問題のある行を見つけるために使用した方法は、ダウンロードできない行に到達するまで、構成ファイルを使用してバルクローダーを使用して各行をダウンロードすることでした。問題のある行を修正すると、ダウンロード/アップロードは正常に機能しました。

注:実際には複数の行でしたが、最初の行を見つけたら、他の行を見つけて問題のあるデータに置き換えるだけでした。

行を見つけるために使用したコマンドは次のとおりです。

appcfg.py upload_data --coinfig_file=bulkloader.yaml --kind=Review --filename=review.csv --application=<MY_APP_ID> --url=http://<MY_APP_ID>.appspot.com/remote_api --rps_limit=500 --bandwidth_limit=2500000 --batch_size=100

注:上記の質問では、構成ファイルを使用していませんでした。すぐ上のこのコマンドで。私は設定ファイルを使用しています。この構成ファイルは、次のコマンドを使用してデータストア統計から生成されます。

appcfg.py create_bulkloader_config --filename=bulkloader.yaml --application=<appname> --url=http://<appname>.appspot.com/remote_api

構成ファイルを使用する主な理由は、適切な csv ファイルでフォーマットされたデータストアをダウンロードするためです。


質問?

何らかの理由で、一括ローダーで構成ファイルを指定しない場合。ダウンロードした csv はすべて乱雑です。つまり、大量のランダムな文字が含まれています。ただし、これらのファイルをデータストアにアップロードして戻すのに問題はありません。

データストアにアップロードするときに、適切にフォーマットされた csv ファイルとこれらの乱雑な csv ファイルの両方が機能するのはなぜですか?


問題のある行

実際の問題は、publisheddateプロパティの一部のデータの値が 00/00/0000 (MM/DD/YYYY) に設定されていたことです。Java はそれをDate0001 年 1 月 2 日日曜日の値に変換しました (値について引用しないでください。ただし、その年は 0001 だったことを思い出します)。

これは問題なく GAE データストアに挿入されましたが、バルク ローダーがこれらの値をダウンロードまたはアップロードしようとすると、lambda val: _EPOCH + datetime.timedelta(microseconds=val), OverflowError: date value out of range上記のようにエラーが発生します。

于 2011-06-20T01:31:19.813 に答える