apache / apache/beam

[Bug]: Accessing Hive using JdbcIO throws HivePreparedStatement.getMetaData, method not supported

Open
#26,536 4 comments 0 reactions 0 assignees View on GitHub
bug io java P2
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():
![pic1](https://user-images.githubusercontent.com/20527360/236100280-464abb7d-a3c8-43cf-abae-5462ed0182d2.jpeg)
![pic2](https://user-images.githubusercontent.com/20527360/236100390-f5f77b5b-0dc7-4d28-9988-f13b1c818b60.jpeg)

**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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.