Java Загрузка Google App Engine при массовой загрузке «OverflowError: значение даты вне диапазона» - PullRequest
2 голосов
/ 11 июня 2011

Я использую массовый загрузчик для загрузки моего отзыва вида с одного сервера GAE и загрузки на другой сервер GAE. Этот обзор содержит около 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

Я подозреваю, что это связано с неверно отформатированной датой, найденной в моем столбце publdate (полный список Review см. Ниже).


То, что я уже пытался исправить

Я запустил GQL: SELECT * FROM Review where publisheddate = null на административном портале GAE и обнаружил около 15 сущностей со значениями null для столбца publdate . Поэтому я удалил их, перезагружал и попытался перегрузить вид Review . Я все еще получаю ту же ошибку.

Я думаю, так как я использую команду загрузки без параметра файла конфигурации, например --config_file=bulkloader.yaml (см. Загрузку выше, я не указываю --config_file)

Я полагаюсь на статистику хранилища данных, чтобы определить, что загружается в мой файл review.csv .

Теперь, так как я только что удалил сущности с null publdate , эта повторная загрузка и последующая повторная загрузка не делают ничего, отличного от моей первоначальной загрузки и выгрузки. Поскольку статистика хранилища данных еще не обновлена.


Мои вопросы

  1. Поскольку существует 30 000 объектов, я не уверен в том, как найти объекты с плохо сформированными датами. Есть ли способ быстро найти объекты с неправильными значениями publdate ?

  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

1 Ответ

1 голос
/ 20 июня 2011

Способ поиска проблемной строки

Метод, который я использовал для поиска проблемной строки, заключался в использовании загрузчика 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 (ММ / ДД / ГГГГ). Java преобразовала его в Date со значением воскресенья 2 января 0001 (не указывайте меня по значению, но я помню, что это было 0001 для года).

Это было вставлено в штраф хранилища данных GAE, но когда массовый загрузчик пытается загрузить или загрузить эти значения, он жалуется с ошибкой: lambda val: _EPOCH + datetime.timedelta(microseconds=val), OverflowError: date value out of range, как указано выше.

...