2016-10-27 2 views
1

私はHortonworksのJDBCドライバを使ってVirtualBoxのデータベースに接続しているJavaプログラムを持っています。すべて正常に動作しますが、SQLクエリではコロンに問題があります。HIVE JDBCドライバを使用して列名に特殊文字を使用する方法は?

query = new StringBuilder("SELECT ROW_NUMBER() OVER() AS "+rowid+", * FROM "+tableName).toString(); 

私が設定しようとしているROWIDは ":ROWID:"です。列名を他のアプリケーションで一意にするために、前面と背面にコロンを追加します。コロンはそこにいなければなりません。公式サイトからApache Hive用のHortonworks JDBC Driver(v1.0.36)を使用する方法があるかどうかを知りたいと思っています。私はそこにコロンなしでテストして、それは動作します。

JDBCドライバのバージョン:HiveJDBC 01.00.36.1046 ます。java.sql.SQLException:[シンバ] HiveJDBCDriver ERROR処理クエリ/文のコロン、エラーメッセージが表示されて

。エラーコード:40000、SQLステート:TStatus(statusCode:ERROR_STATUS、infoMessages:[* org.apache.hive.service.cli.HiveSQLException:ステートメントのコンパイル中にエラー:FAILED:ParseException line 1:30が 'AS' :選択されたターゲットで '' rowid ':17:16、org.apache.hive.service.cli.operation.Operation:toSQLException:Operation.java:335、org.apache.hive.service.cli.operation.SQLOperation:prepare :SQLOperation.java:148、org.apache.hive.service.cli.operation.SQLOperation:runInternal:SQLOperation.java:226、org.apache.hive.service.cli.operation.Operation:run:Operation.java:276 、org.apache.hive.service.cli.session.HiveSessionImpl:executeStatementInternal:HiveSessionImpl.java:468、org.apache.hive.service.cli.session.HiveSessionImpl:executeStatementAsync:HiveSessionImpl.java:456、org.apache.hive .service.cli.CLIService:executeStatementAsync:CLIService.java:298、org.apache.hive.service.cli.thrift.ThriftCLIService:ExecuteStatement:ThriftCLIService.java:506、org.apache.hive.service.cli.thrift。 TCLIService $ Processor $ ExecuteStatement:getResult:TCLIService.java:1317、org.apache.hive.service.cli.thrift.TCLIService $ Processor $ ExecuteStatement:getResult:TCLIService.java:1302、org.apache.thrift.ProcessFunction:process: ProcessFunction.java:39、org.apache.thrift.TBaseProcessor:プロセス:TBaseProcessor.java:39、org.apache.hive.service.auth.TSetIpAddressProcessor:プロセス:TSetIpAddressProcessor.java:56、org.apache.thrift.server。 TThreadPoolServer $ WorkerProcess:実行:TThreadPoolServer.java:286、java.util.concurrent.ThreadPoolExecutor:runWorker:ThreadPoolExecutor.java:1145、java.util.concurrent.ThreadPoolExecutor $ワーカー:実行:ThreadPoolExecutor.java:615、java.lang。スレッド:run:Thread.java:745、* org.apache.hadoop.hive.ql.parse.ParseException:行1:30は 'AS'の近くの入力を認識できません ':' rowid 'in selection target:22:6、 org.apache.hadoop.hive.ql.parse.ParseDriver:parse:ParseDriver.java:205、org.apache.hadoop.hive.ql.parse.ParseDriver:parse:ParseDriver.java:166、org.apache.hadoop。 hive.ql.Driver:comp ile:Driver.java:437、org.apache.hadoop.hive.ql.Driver:compile:Driver.java:320、org.apache.hadoop.hive.ql.Driver:compileInternal:Driver.java:1219、org。コンパイルおよびリダイレクト:Driver.java:1213、org.apache.hive.service.cli.operation.SQLOperation:prepare:SQLOperation.java:146]、sqlState:42000、errorCode:40000、errorMessage :エラー:ParseException行1:30は、 'AS'の近くの入力を認識できません: '' rowid 'in selection target)、クエリ:SELECT ROW_NUMBER()OVER()AS:rowid :, * FROM input。 com.simba.hiveserver2.hivecommon.api.HS2Client.executeStatementInternal(不明なソース) com.simba.hiveserver2.hivecommon.api.HS2Client.executeStatement(不明なソース) com.simba.hiveserver2.hivecommon.dataengine。 com.simba.hiveserver2.hivecommon.dataengine.HiveJDBCDataEngine.prepareでcom.simba.hiveserver2.hivecommon.dataengine.HiveJDBCNativeQueryExecutor。(不明なソース) でHiveJDBCNativeQueryExecutor.executeQuery(不明なソース) (不明なソース)com.simbaで 。 hiveserver2.jdbc.common.SStatement.executeNoParams(不明なソース) (com.simba.hiveserver2.jdbc.common.SStatement)。executeQuery(不明なソース)

誰にも分かりませんか?私は、文字列に 'と\」を追加しようとしましたが、それらはすべてのエラーを与える列名に

答えて

1

特殊文字はバックティック( `)文字で囲む必要があります。。より多くのために

new StringBuilder("SELECT ROW_NUMBER() OVER() as `"+rowid+"`, * FROM "+tableName).toString(); 

読むSupporting Quoted Identifiers in Column Names詳細:

+0

ありがとうございます。これはクローズされていますが、列名は_c0と表示されています:rowid:私が望むのは結果セットから取得するデータでも1:ROWID:2:ROWID:3 :rowid: –

+0

私は答え –

+0

を更新しました申し訳ありません、多分私の質問は混乱しています。私が欲しいものを説明するために最善を尽くします。 」は「:rowid:」であること。 rowidという単語の前と後ろにコロンがあります。その理由は、他の列に同じ名前を付けることができないように、それを一意の名前にすることです。あなたが提供した答えは、私が望むコロンなしで列名をROWIDとして生成します。 –

関連する問題