Solr DataImportHandler CachedSqlEntityProcessor ClassCastException

Я использую Solr 4.6.0 и пытаюсь импортировать свои данные с помощью CachedSqlEntityProcessor, но каким-то образом получаю ClassCastException.

Схема

<fields>
   <field name="_version_" type="long" indexed="true" stored="true"/>
   <field name="id" type="int" indexed="true" stored="true" required="true" multiValued="false" /> 
   <field name="conference" type="string" indexed="true" stored="true" />
   <field name="year" type="int" indexed="true" stored="true" />
   <field name="doi" type="string" indexed="false" stored="true" />
   <field name="text" type="text_en_shingling" indexed="true" stored="true" />
 </fields>

Конфигурация данных

<dataConfig>
    <dataSource name="mysql" type="JdbcDataSource" 
        driver="com.mysql.jdbc.Driver" 
        url="..." 
        batchSize="-1" 
        user="..." password="..." />
    <document name="publications">
        <entity name="publication" query="
            SELECT
                sm_publications.id AS p_id,
                sm_publications.year AS p_year,
                sm_publications.doi AS p_doi,
                CONCAT(sm_publications.title, ' ', sm_publications.abstract) AS p_text,
                sm_publications.conference_id 
            FROM sm_publications 
            WHERE '${dataimporter.request.clean}' != 'false' OR 
                modified > '${dataimporter.last_index_time}'">
            <field column="p_id" name="id" />
            <field column="p_text" name="text" />
            <field column="p_year" name="year" />
            <field column="p_doi" name="doi" />

            <entity name="conference" query="SELECT id AS CID,full_name FROM sm_conferences"
                processor="CachedSqlEntityProcessor" cacheKey="CID" cacheLookup="publication.conference_id">
                <field column="full_name" name="conference" />
            </entity>

        </entity>
    </document>
</dataConfig>

Сообщение об ошибке

Full Import failed:java.lang.RuntimeException: java.lang.RuntimeException: org.apache.solr.handler.dataimport.DataImportHandlerException: java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
    at org.apache.solr.handler.dataimport.DocBuilder.execute(DocBuilder.java:270)
    at org.apache.solr.handler.dataimport.DataImporter.doFullImport(DataImporter.java:411)
    at org.apache.solr.handler.dataimport.DataImporter.runCmd(DataImporter.java:476)
    at org.apache.solr.handler.dataimport.DataImportHandler.handleRequestBody(DataImportHandler.java:179)
    at org.apache.solr.handler.RequestHandlerBase.handleRequest(RequestHandlerBase.java:135)
    at org.apache.solr.core.SolrCore.execute(SolrCore.java:1859)
    at org.apache.solr.servlet.SolrDispatchFilter.execute(SolrDispatchFilter.java:710)
    at org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:413)
    at org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:197)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1419)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:455)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:557)
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1075)
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:384)
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1009)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:255)
    at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:154)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
    at org.eclipse.jetty.server.Server.handle(Server.java:368)
    at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:489)
    at org.eclipse.jetty.server.BlockingHttpConnection.handleRequest(BlockingHttpConnection.java:53)
    at org.eclipse.jetty.server.AbstractHttpConnection.content(AbstractHttpConnection.java:953)
    at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.content(AbstractHttpConnection.java:1014)
    at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:861)
    at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:240)
    at org.eclipse.jetty.server.BlockingHttpConnection.handle(BlockingHttpConnection.java:72)
    at org.eclipse.jetty.server.bio.SocketConnector$ConnectorEndPoint.run(SocketConnector.java:264)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.RuntimeException: org.apache.solr.handler.dataimport.DataImportHandlerException: java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
    at org.apache.solr.handler.dataimport.DocBuilder.buildDocument(DocBuilder.java:410)
    at org.apache.solr.handler.dataimport.DocBuilder.doFullDump(DocBuilder.java:323)
    at org.apache.solr.handler.dataimport.DocBuilder.execute(DocBuilder.java:231)
    ... 33 more
Caused by: org.apache.solr.handler.dataimport.DataImportHandlerException: java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
    at org.apache.solr.handler.dataimport.DataImportHandlerException.wrapAndThrow(DataImportHandlerException.java:63)
    at org.apache.solr.handler.dataimport.EntityProcessorWrapper.nextRow(EntityProcessorWrapper.java:246)
    at org.apache.solr.handler.dataimport.DocBuilder.buildDocument(DocBuilder.java:469)
    at org.apache.solr.handler.dataimport.DocBuilder.buildDocument(DocBuilder.java:495)
    at org.apache.solr.handler.dataimport.DocBuilder.buildDocument(DocBuilder.java:408)
    ... 35 more
Caused by: java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
    at java.lang.String.compareTo(Unknown Source)
    at java.util.TreeMap.getEntry(Unknown Source)
    at java.util.TreeMap.get(Unknown Source)
    at org.apache.solr.handler.dataimport.SortedMapBackedCache.iterator(SortedMapBackedCache.java:147)
    at org.apache.solr.handler.dataimport.DIHCacheSupport.getIdCacheData(DIHCacheSupport.java:179)
    at org.apache.solr.handler.dataimport.DIHCacheSupport.getCacheData(DIHCacheSupport.java:145)
    at org.apache.solr.handler.dataimport.EntityProcessorBase.getNext(EntityProcessorBase.java:129)
    at org.apache.solr.handler.dataimport.SqlEntityProcessor.nextRow(SqlEntityProcessor.java:75)
    at org.apache.solr.handler.dataimport.EntityProcessorWrapper.nextRow(EntityProcessorWrapper.java:243)
    ... 38 more

Структура таблицы введите здесь описание изображения


person Vilius    schedule 04.02.2014    source источник
comment
Я думаю, вам нужно поместить mysql-connector-java-5.1.*.jar в папку lib.   -  person Sathish D    schedule 04.02.2014
comment
В подключении нет ничего плохого. Если я удаляю объект conference, все работает нормально. Это означает, что сущность publication успешно обработана.   -  person Vilius    schedule 04.02.2014
comment
Вы пробовали какое-либо из предложенных решений? Один помог? Или действительно ни один из них?   -  person cheffe    schedule 14.02.2014


Ответы (5)


CachedSqlEntityProcessor использует DIHCacheSupport(Map<String,Object> getIdCacheData(...)), который не адаптирован для работы с ключами типа Integer, что является ожидаемым поведением для любого кеша. (Object key = context.resolve(cacheForeignKey);, этот ключ действительно должен быть типа String)

SELECT CAST(id as CHAR(32)) AS CID,full_name FROM sm_conferences 
person Ion Cojocaru    schedule 12.02.2014
comment
Это фактически решило проблему ClassCastException, но, к сожалению, таблицы не были объединены. Это означает, что хотя ошибка исчезла, импортировать conferences не удалось. Это означает, что должно быть найдено больше ошибок... - person Vilius; 17.02.2014
comment
На самом деле я создал еще один поток с более общей целью - способы повышения производительности импорта stackoverflow.com/questions/21841186/ - person Vilius; 18.02.2014

Это дело случая. Вам нужно написать ключ в атрибуте cacheLookup в верхнем регистре. Если вы используете

cacheLookup="publication.CONFERENCE_ID"

это сработает.

Все столбцы, которые вы собираете для объекта publication, собираются внутри Карты. Ключи к этой карте написаны в верхнем регистре. Когда вы пишете cacheLookup="publication.CONFERENCE_ID", эта короткая часть после знака равенства publication.CONFERENCE_ID является кратчайшим путем к этой карте. Очевидно, в какой-то момент между ними отсутствует String#toUpper.


Я добавил тестовый пример по этому поводу, посмотрите на DIHCachedTest проверьте его и запустите. Для этого вам понадобится maven. Я создаю встроенную базу данных HSQLDB, которая имитирует вашу схему, и запускаю встроенную Solr, которая имеет две конфигурации импорта данных.

  • src/main/resources/solr/dih-cached/conf/data-config-fault.xml
  • src/main/resources/solr/dih-cached/conf/data-config.xml

Первый используется для тестового примера DIHCachedTest#runImportWithFault. Это приведет к той же ошибке, которую вы разместили в своем вопросе.

Второй используется для тестового примера DIHCachedTest#runImport. Это удастся.

Если вы сравните обе конфигурации, вы увидите, что единственное различие заключается в случае cacheLookup="publication.CONFERENCE_ID" и cacheLookup="publication.conference_id".


Проблема SOLR-2483 DIH — проблема с прописными буквами в параметрах запроса описывает этот шаблон ошибки. .

person cheffe    schedule 12.02.2014

Это регресс, связанный с введением поддержки подключаемого кэша в https://issues.apache.org/jira/browse/SOLR-2382, а обходной путь (у меня работает) заключается в приведении к строкам во всех столбцах, которые вы будете использовать в качестве ключей или значений. В синтаксисе приведения PostgreSQL:

<entity name="par" dataSource="d" query="SELECT id, xyz, child_id::text FROM par;">
  <entity name="child" dataSource="d" query="SELECT id::text, abc FROM child;"
          processor="CachedSqlEntityProcessor"
          where="id=par.child_id"/>
</entity>

(и в других БД, я думаю, вам нужно CAST(id AS VARCHAR(10) или что-то подобное вместо id::text).

person Gunnlaugur Briem    schedule 13.02.2014
comment
О, упс, у Иона Кожокару, по сути, тот же ответ, опубликованный ранее; он должен получить награду. - person Gunnlaugur Briem; 13.02.2014

Я не думаю, что с вашей конфигурацией dataimporthandler что-то не так, я бы предпочел проверить, соответствуют ли ваши типы базы данных вашему соответствующему проданному типу поля

Что-то вроде типа базы данных, в результате чего java.lang.Integer передается в поле solr на основе java.lang.String

OUPS, возможно, я ошибся, ваше поле uniqueKey для SOLR все еще «id»? вы установили в своей схеме это поле как целое число, что является плохой идеей.

http://wiki.apache.org/solr/SchemaXml#The_Unique_Key_Field

«Обратите внимание, что если вы включили QueryElevationComponent в solrconfig.xml, для этого требуется, чтобы схема имела уникальный ключ типа StrField. Это не может быть, например, поле int».

person Jerome Diaz    schedule 06.02.2014
comment
не могли бы вы поделиться структурой своей таблицы? - person Jerome Diaz; 06.02.2014
comment
Я только что обновил свой вопрос и добавил графическую структуру базы данных. Мой uniqueKey по-прежнему является целым числом, но ClassCastException возникает только в том случае, если я включаю сущность conference. Если я удалю его из своего dataconfig, процесс импорта завершится успешно. - person Vilius; 06.02.2014

Solr CachedSqlEntityProcessor устарел примерно в версии 4.5. Новый синтаксис использует cacheImpl, cacheKey и cacheLookup.

Мне пришлось обновить SQL в моем data-config.xml

Старый синтаксис

processor="CachedSqlEntityProcessor"
where="fkId=parentTable.parentId"

Новый синтаксис

cacheKey="fkId" cacheLookup="parenttable.parentId" cacheImpl="SortedMapBackedCache"

См. полную последнюю информацию о вики Solr, старая страница DataImportHanlder устарела https://cwiki.apache.org/confluence/display/solr/Uploading+Structured+Data+Store+Data+with+the+Data+Import+Handler#UploadingStructuredDataStoreDatawiththeDataImportHandler-EntityProcessors

person Baxny    schedule 15.07.2016