Java Google App Engine批量加载程序上传错误“OverflowError:日期值超出范围”



我正在使用批量加载程序从一个GAE服务器下载我的Review类,并上传到另一个GAE服务器。这类Review包含大约30000个实体。

我使用命令上传:

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

我怀疑这是由于在我的publisheddate列中发现格式错误的日期造成的(请参阅下面的整个评论类型)。


我已经试着修复了

我在GAE管理门户中运行了GQL:SELECT * FROM Review where publisheddate = null,发现大约有15个实体的publisheddate列的值为null。所以我删除了这些,重新下载并尝试重新加载Review类型。我仍然会犯同样的错误。

我在想,因为我使用的上传命令没有配置文件参数,例如--config_file=bulkloader.yaml(请参阅上面的上传,我没有指定--config_file

我依靠数据存储统计信息来确定下载到我的review.csv文件中的内容。

现在,由于我刚刚删除了null publisheddate的实体,因此重新下载并立即重新加载与我最初的下载和上传没有任何不同。由于数据存储统计信息尚未更新。


我的问题

  1. 由于有30000个实体,我不确定如何找到日期格式不正确的实体。是否有快速定位具有错误发布日期值的实体的方法?

  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

查找问题行的方法

我用来查找有问题的行的方法是使用批量加载程序WITH一个配置文件来下载每一行,直到它到达无法下载的行。一旦我纠正了问题行,下载/上传就很好。

注意:事实上,它是多行的,但一旦我找到第一行,只需要找到/用有问题的数据替换其他行

我用来查找行的命令是:

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将其转换为Date,值为0001年1月2日星期日(不要引用我的值,但我记得当年是0001)。

这被很好地插入到GAE数据存储中,但当大容量加载程序尝试下载或上传这些值时,它会报告错误:如上所述的lambda val: _EPOCH + datetime.timedelta(microseconds=val), OverflowError: date value out of range

相关内容

  • 没有找到相关文章

最新更新