我正在使用批量加载程序从一台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
我怀疑这是由于我的已发布日期列中的日期格式错误导致的(请参阅下面的整个评论类型)。
我在GAE管理门户网站上运行了GQL:SELECT * FROM Review where publisheddate = null
,并找到了已发布日期列的 null 值的大约15个实体。所以我删除了那些,redownloaded并尝试重新上载评论类。我仍然得到同样的错误。
我在想,因为我在没有配置文件参数的情况下使用upload命令,例如--config_file=bulkloader.yaml
(请参阅上面的内容,我没有指定--config_file
)
我依靠数据存储区统计信息来确定下载到 review.csv 文件的内容。
现在,因为我刚刚删除了 null publisheddate 的实体,所以这次重新下载然后立即重新上载与我的初始下载和上传没有任何不同。由于数据存储区统计信息尚未更新。
由于有30,000个实体,我不确定如何找到格式错误的实体。是否可以快速找到具有错误已发布日期值的实体?
有谁知道如何解决这个问题?我不确定错误跟踪真正的问题是什么。
我正在使用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
答案 0 :(得分:1)
我用来查找有问题的行的方法是使用批量加载程序 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
注意:在上面的问题中,我使用配置文件 NOT 。在上面的这个命令中。我正在使用配置文件。此配置文件使用以下命令从数据存储区统计信息生成:
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
而抱怨。