Отсутствует обработка конвертера для полного имени класса = org. postgresql .util.PGobject, простое имя = PGobject - PullRequest
1 голос
/ 08 мая 2020

В моей таблице postgres есть столбец типа геометрии. Я проверил, что остальные столбцы работают нормально postgres -> logsta sh -> elasticsearch. Однако я не уверен, как отлить тип геометрии. Кто-нибудь может дать совет, как отлить? Пожалуйста, помогите мне.

вот моя конф.

    jdbc {
    jdbc_connection_string => "jdbc:postgresql://localhost:5432/atlasdb?useTimezone=true&useLegacyDatetimeCode=false&serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=utf8"
    jdbc_user => "atlas"
    jdbc_password => "atlas"
    jdbc_validate_connection => true
    jdbc_driver_library => "/lib/postgres-42-test.jar"
    jdbc_driver_class => "org.postgresql.Driver"
    columns_charset => { "region_name_kr" => "UTF-8" }
    schedule => "* * * * *"
    statement => "SELECT region_id, region_name_full, boundaries_nearby from expedia_region_union_copy_jpa_test order by region_id asc limit 100"
}

stdin {
    codec => plain { charset => "UTF-8"}
}

}
filter {
    json { source => "boundaries_nearby" }
}
output {
    elasticsearch {
    hosts => [ "localhost:9200" ]
    index => "2020-05-06-wed"
    doc_as_upsert => true
    action => "update"
    document_id => "%{region_id}"
}
    stdout { codec => rubydebug }
}

https://discuss.elastic.co/t/sql-query-from-logstash-causes-an-error-pgobject/138648 Кажется, этот вопрос частично совпадает с этим, но я не смог найти ключ к разгадке.

вот мой пример данных геометрии

POLYGON ((19.969742 52.425483, 19.972195 52.424076, 19.973841 52.422807, 19.976831 52.419417, 19.976941 52.419093, 19.976941 52.419093, 19.976941 52.419093 , что-то еще ...))

также я думаю, что это https://discuss.elastic.co/t/missing-converter-handling-for-full-class-name-org-postgresql-util-pgobject-simple-name-pgobject/163338/3 может быть ответом. но я не очень хорошо понимаю этот ответ.

"Проблема решается преобразованием результата json в строку на уровне postgres и синтаксическим анализом строки json в logsta sh . "

Если кто может это объяснить, помогите пожалуйста. Или, пожалуйста, ответьте человеку, у которого была такая же проблема. заранее спасибо.

1 Ответ

0 голосов
/ 08 мая 2020

У меня была проблема с jsonb и geometry type casting, при загрузке данных в elasticsearch с использованием logsta sh in postgres.

В заключение

Для типа геометрии используйте st_asgeo json, чтобы изменить его. Затем возвращается строка. Затем вы можете преобразовать его снова с помощью json.

В случае jsonb я получил его как текст и проанализировал его с помощью json, используя фильтр ruby. Я не уверен, что это лучший способ получить go. Тем не менее, проблема была решена.

вот мой пример файла conf. В силу обстоятельств, возможно, произошла опечатка. Использовать после подтверждения.

input {
    jdbc {
        jdbc_connection_string => "jdbc:postgresql://ip:port/dbname"
        jdbc_user => "user"
        jdbc_password => "password"
        jdbc_driver_library => "driver.jar"
        jdbc_validate_connection => true
        jdbc_driver_class => "org.postgresql.Driver"
        columns_charset => {"region_name_kr" => "UTF-8"}
        schedule => "*/10 * * * *"
        statement => "SELECT region_id, region_name, st_asgeojson(boundaries) as boundaries
                             country::text from expedia_region_union"
        jdbc_paging_enabled => "true"
        jdbc_page_size => "100000"
    }    
    stdin {
        codec => plain { charset => "UTF-8" }
    }
}
filter {
    ruby {
        code => "
            require 'json'
            begin
                country_json = JSON.parse(event.get('country').to_s || '{}')
                event.set('country', country_json)
            rescue Exception => e
                event.tag('invalide country json')
            end
            begin
                boundaries_json = JSON.parse(event.get('boundaries').to_s || '{}')
                event.set('boundaries', boundaries_json)
            rescue Exception => e
                event.tag('invalide boundaries json')
            end
        "
    }
}
output {
    elasticsearch {
        hosts => ["https://host"] # if you have many elastic nodes, please pick master node. 
        index => "indexName"
        doc_as_upsert => true
        action => "update"
        document_id => "%{region_id}"
    }
    stdout { codec => rubydebug }
}
  1. { ссылка }
  2. https://postgis.net/docs/ST_AsText.html
  3. https://discuss.elastic.co/t/painful-postgres-logstash-elasticsearch-mapper-parsing-exception/44918/3
...