elasticsearch,logstash,sqlexception,crate,Jdbc,elasticsearch,Logstash,Sqlexception,Crate" /> elasticsearch,logstash,sqlexception,crate,Jdbc,elasticsearch,Logstash,Sqlexception,Crate" />

Jdbc java.sql.SQLException:对<;的验证失败;字段名称>;:';空';无法强制转换为类型double

Jdbc java.sql.SQLException:对<;的验证失败;字段名称>;:';空';无法强制转换为类型double,jdbc,elasticsearch,logstash,sqlexception,crate,Jdbc,elasticsearch,Logstash,Sqlexception,Crate,我正在使用logstash创建从elasticsearch到crate.io的管道。下面是配置 input{ elasticsearch { hosts => "<host_name>:9200" index => "index1" query => '{ "size":10,"query": {"match_all": {} } }' } } filter{ if!([bench_pose][M_Body_t]) {

我正在使用logstash创建从elasticsearch到crate.io的管道。下面是配置

input{
 elasticsearch {
   hosts => "<host_name>:9200"
   index => "index1"
   query => '{ "size":10,"query": {"match_all": {} } }'
   }
}
filter{
    if!([bench_pose][M_Body_t]) {
            mutate{
                    add_field => {"[bench_pose][M_Body_t]" => null}
            }
    }
    if!([bench_pose][M_Jaw_t]) {
            mutate{
                    add_field => {"[bench_pose][M_Jaw_t]" => null}
            }
    }
}
output{
 jdbc {
       driver_class => "io.crate.client.jdbc.CrateDriver"
       driver_auto_commit => false
       driver_jar_path => "/etc/crate/crate-jdbc-standalone-1.12.3.jar"
       connection_string => "crate://<host_ip>:4300"
       statement => ["INSERT INTO table_name(path,bench_pose_m_Body_t,bench_pose_m_jaw_t) VALUES(?,?,?)",'path','%{[bench_pose][M_Body_t]}','%{[bench_pose][M_Jaw_t]}']
   }
}
如果我删除过滤器插件,它会抛出一个错误,如下所示

JDBC - Exception. Not retrying. {:exception=>java.sql.SQLException: Validation failed for bench_pose_m_body_t: '%{[bench_pose][M_Body_t]}' cannot be cast to type double
如果我在insert中硬编码null值并在cratesql上运行查询,它将正确执行。
如何在logstash中解析这些字段中的空值?

您需要将INSERT语句更改为:

   statement => ["INSERT INTO table_name(path,benc‌​h_pose_m_Body_t,bench‌​_pose_m_jaw_t) VALUES(?,TRY_CAST(? as double),TRY_CAST(? as double))",'path','%{[bench_pose][M_Body_t]}','%{[bench_pose][M_Jaw_t]}']

如果类型转换不兼容,将返回null而不是抛出错误。

您需要将INSERT语句更改为:

   statement => ["INSERT INTO table_name(path,benc‌​h_pose_m_Body_t,bench‌​_pose_m_jaw_t) VALUES(?,TRY_CAST(? as double),TRY_CAST(? as double))",'path','%{[bench_pose][M_Body_t]}','%{[bench_pose][M_Jaw_t]}']

如果类型转换不兼容,将返回null而不是抛出错误。

您的DB字段
是否可以为null?如果不是,您可以在mutate Filteries、bench_pose_m_body_t中创建它时将其初始化为0‌​ 字段可为空。如何保留从源输入的空值并将其解析到目标?能否将插入查询更改为:
INSERT-into-table\u name(path,bench\u-pose\u-Body\t,bench\u-pose\u-m\u-jaw\t)值(?,TRY\u-CAST(?as-double),TRY\u-CAST(?as-double))
是的,现在工作正常。非常感谢。您的DB字段
工作台姿势\u身体\u t
是否可以为空?如果不是,您可以在mutate Filteries、bench_pose_m_body_t中创建它时将其初始化为0‌​ 字段可为空。如何保留从源输入的空值并将其解析到目标?能否将插入查询更改为:
INSERT-into-table\u name(path,bench\u-pose\u-Body\t,bench\u-pose\u-m\u-jaw\t)值(?,TRY\u-CAST(?as-double),TRY\u-CAST(?as-double))
是的,现在工作正常。非常感谢。是的,当然。非常感谢。是的,当然。非常感谢。