[Bug]: Accessing Hive using JdbcIO throws HivePreparedStatement.getMetaData, method not supported
- Dominant language
- Java
- Stars
- 8.7k
- Forks
- 4.7k
- Avg merge
- 1d 20h
- Merged PRs (30d)
- 196
Description
### What happened?
**My issue:**
I'm trying to access hive table using beam JDBCIO. But below exception has thrown while connecting to hive:
```
java.lang.RuntimeException: Error while determining columns from table: test_date_output
at org.apache.beam.sdk.io.jdbc.JdbcIO$WriteVoid.getFilteredFields (JdbcIO.java:2117)
at org.apache.beam.sdk.io.jdbc.JdbcIO$WriteVoid.expand (JdbcIO.java:2064)
at org.apache.beam.sdk.io.jdbc.JdbcIO$Write.expand (JdbcIO.java:1698)
at org.apache.beam.sdk.io.jdbc.JdbcIO$Write.expand (JdbcIO.java:1596)
at org.apache.beam.sdk.Pipeline.applyInternal (Pipeline.java:548)
at org.apache.beam.sdk.Pipeline.applyTransform (Pipeline.java:482)
at org.apache.beam.sdk.values.PCollection.apply (PCollection.java:360)
at com.bytedance.eprivacy.data_anonymization_pipeline.io.jdbc.JdbcWrite.WriteToJdbc (JdbcWrite.java:10)
at com.bytedance.eprivacy.data_anonymization_pipeline.pipeline.PipelineFactory.setupOutput (PipelineFactory.java:73)
at com.bytedance.eprivacy.data_anonymization_pipeline.pipeline.PipelineFactory.getPipeline (PipelineFactory.java:47)
at com.bytedance.eprivacy.data_anonymization_pipeline.DataAnonymizationPipeline.main (DataAnonymizationPipeline.java:15)
at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke (Method.java:498)
at org.codehaus.mojo.exec.ExecJavaMojo$1.run (ExecJavaMojo.java:282)
at java.lang.Thread.run (Thread.java:748)
Caused by: java.sql.SQLFeatureNotSupportedException: Method not supported
at org.apache.hive.jdbc.HivePreparedStatement.getMetaData (HivePreparedStatement.java:201)
at org.apache.commons.dbcp2.DelegatingPreparedStatement.getMetaData (DelegatingPreparedStatement.java:151)
at org.apache.commons.dbcp2.DelegatingPreparedStatement.getMetaData (DelegatingPreparedStatement.java:151)
at org.apache.beam.sdk.io.jdbc.JdbcIO$WriteVoid.getFilteredFields (JdbcIO.java:2114)
at org.apache.beam.sdk.io.jdbc.JdbcIO$WriteVoid.expand (JdbcIO.java:2064)
at org.apache.beam.sdk.io.jdbc.JdbcIO$Write.expand (JdbcIO.java:1698)
at org.apache.beam.sdk.io.jdbc.JdbcIO$Write.expand (JdbcIO.java:1596)
at org.apache.beam.sdk.Pipeline.applyInternal (Pipeline.java:548)
at org.apache.beam.sdk.Pipeline.applyTransform (Pipeline.java:482)
at org.apache.beam.sdk.values.PCollection.apply (PCollection.java:360)
at com.bytedance.eprivacy.data_anonymization_pipeline.io.jdbc.JdbcWrite.WriteToJdbc (JdbcWrite.java:10)
at com.bytedance.eprivacy.data_anonymization_pipeline.pipeline.PipelineFactory.setupOutput (PipelineFactory.java:73)
at com.bytedance.eprivacy.data_anonymization_pipeline.pipeline.PipelineFactory.getPipeline (PipelineFactory.java:47)
at com.bytedance.eprivacy.data_anonymization_pipeline.DataAnonymizationPipeline.main (DataAnonymizationPipeline.java:15)
at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke (Method.java:498)
at org.codehaus.mojo.exec.ExecJavaMojo$1.run (ExecJavaMojo.java:282)
at java.lang.Thread.run (Thread.java:748)
```
**Below code is trying to access hive:**
```
pipeline.apply(JdbcIO.readWithPartitions().withDataSourceConfiguration(
JdbcIO.DataSourceConfiguration.create("org.apache.hive.jdbc.HiveDriver", "jdbc:hive2:///mydb")
.withUsername("username").withPassword("password"))
.withTable("test_date_output").withPartitionColumn("id")
.withRowOutput());
```
**beam version**
`2.43.0`
**bug analysis:**
It seems that the method getFilteredFields used PreparedStatement to deal the sql query result, but hive driver has not implement PreparedStatement.getMetadata():


**demand**
although accessing hive table by hive metastore is ok, it is more urgent for us to access hive table by hive server2. Thanks for checking and look forward to your reply.
### Issue Priority
Priority: 0 (outage / urgent vulnerability)
### Issue Components
- [ ] Component: Python SDK
- [X] Component: Java SDK
- [ ] Component: Go SDK
- [ ] Component: Typescript SDK
- [X] Component: IO connector
- [ ] Component: Beam examples
- [ ] Component: Beam playground
- [ ] Component: Beam katas
- [ ] Component: Website
- [ ] Component: Spark Runner
- [ ] Component: Flink Runner
- [ ] Component: Samza Runner
- [ ] Component: Twister2 Runner
- [ ] Component: Hazelcast Jet Runner
- [ ] Component: Google Cloud Dataflow Runner
Contributor guide
Assessment
This issue has not been assessed yet.