分享

Hiverserver2 JDBC prepareStatement 现象疑问

chyeers 发表于 2016-10-10 18:43:58 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 4 15833
本帖最后由 chyeers 于 2016-10-10 18:47 编辑

[mw_shl_code=sql,true] String sql = "insert overwrite table a partition(type='test') select ip FROM " +
                "a WHERE type=?";

        try {
            System.out.println(new SimpleDateFormat(util.Time.FORMAT).format(new Date()) + " 开始计算");
            pstment = conn.prepareStatement(sql);
            pstment.setString(1 ,"my");
            flag = pstment.execute(sql);
            System.out.println(flag);
            System.out.println(new SimpleDateFormat(util.Time.FORMAT).format(new Date()) + " 计算结束");

        } catch (SQLException e) {
.....[/mw_shl_code]

[mw_shl_code=java,true]org.apache.hive.service.cli.HiveSQLException: Error while compiling statement: FAILED: ParseException line 1:76 cannot recognize input near '?' '<EOF>' '<EOF>' in expression specification
        at org.apache.hive.jdbc.Utils.verifySuccess(Utils.java:264)
        at org.apache.hive.jdbc.Utils.verifySuccessWithInfo(Utils.java:250)
        at org.apache.hive.jdbc.HiveStatement.runAsyncOnServer(HiveStatement.java:309)
        at org.apache.hive.jdbc.HiveStatement.execute(HiveStatement.java:250)
        at bll.UpdateStandtardLine.loginHourCnt(UpdateStandtardLine.java:41)
        at main.LoginCntMain.main(LoginCntMain.java:41)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)[/mw_shl_code]
错误的意思就是说识别不了 ? ,但是这样的操作是prepareStatement 很重要的操作啊

=======================================我是分割线====
[mw_shl_code=java,true]  String sql = "insert overwrite table a partition(type='test') select ip FROM " +
                "a WHERE type='my'";

        try {
            System.out.println(new SimpleDateFormat(util.Time.FORMAT).format(new Date()) + " 开始计算");
            pstment = conn.prepareStatement(sql);
            flag = pstment.execute(sql);
            System.out.println(flag);
            System.out.println(new SimpleDateFormat(util.Time.FORMAT).format(new Date()) + " 计算结束");

        } catch (SQLException e) {
........[/mw_shl_code]

这样不使用问号就完美运行。

于是,WHY???(hive版本 2.1.0)


已有(4)人评论

跳转到指定楼层
arsenduan 发表于 2016-10-10 20:37:47
“?”是啥意思?sql里面根本无法识别。楼主自己不能创造没有的内容。如果type="?",需要标示为字符串



回复

使用道具 举报

arsenduan 发表于 2016-10-10 20:38:57
这个sql是想表达什么,得按照规则来,不能肆意改造。
回复

使用道具 举报

chyeers 发表于 2016-10-11 09:29:41
arsenduan 发表于 2016-10-10 20:38
这个sql是想表达什么,得按照规则来,不能肆意改造。

prepareStatement的用法和解释
1.PreparedStatement是预编译的,对于批量处理可以大大提高效率. 也叫JDBC存储过程
2.使用 Statement 对象。在对数据库只执行一次性存取的时侯,用 Statement 对象进行处理。PreparedStatement 对象的开销比Statement大,对于一次性操作并不会带来额外的好处。
3.statement每次执行sql语句,相关数据库都要执行sql语句的编译,preparedstatement是预编译得, preparedstatement支持批处理
4.
Code Fragment 1:

String updateString = "UPDATE COFFEES SET SALES = 75 " + "WHERE COF_NAME LIKE ′Colombian′";
stmt.executeUpdate(updateString);

Code Fragment 2:

PreparedStatement updateSales = con.prepareStatement("UPDATE COFFEES SET SALES = ? WHERE COF_NAME LIKE ? ");
updateSales.setInt(1, 75);
updateSales.setString(2, "Colombian");
updateSales.executeUpdate();

片断2和片断1的区别在于,后者使用了PreparedStatement对象,而前者是普通的Statement对象。PreparedStatement对象不仅包含了SQL语句,而且大多数情况下这个语句已经被预编译过,因而当其执行时,只需DBMS运行SQL语句,而不必先编译。当你需要执行Statement对象多次的时候,PreparedStatement对象将会大大降低运行时间,当然也加快了访问数据库的速度。
这种转换也给你带来很大的便利,不必重复SQL语句的句法,而只需更改其中变量的值,便可重新执行SQL语句。选择PreparedStatement对象与否,在于相同句法的SQL语句是否执行了多次,而且两次之间的差别仅仅是变量的不同。如果仅仅执行了一次的话,它应该和普通的对象毫无差异,体现不出它预编译的优越性。
5.执行许多SQL语句的JDBC程序产生大量的Statement和PreparedStatement对象。通常认为PreparedStatement对象比Statement对象更有效,特别是如果带有不同参数的同一SQL语句被多次执行的时候。PreparedStatement对象允许数据库预编译SQL语句,这样在随后的运行中可以节省时间并增加代码的可读性。



回复

使用道具 举报

easthome001 发表于 2016-10-13 08:40:30
可以在这句之前,加一个输出语句,复制下来,放到hive去执行,看看到底发生了什么情况
flag = pstment.execute(sql);
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条