【问题标题】:hive semantic exception while inserting the data插入数据时配置单元语义异常
【发布时间】:2016-05-12 13:38:40
【问题描述】:

我用 ORC 创建了一个配置单元表。如果我从 hive 控制台插入数据,它工作得很好。但是如果我从 Jdbc 代码插入数据。它会抛出 hive 语义异常。

错误

rg.apache.hive.service.cli.HiveSQLException:编译语句时出错:FAILED:SemanticException [错误 10293]:无法为插入值创建临时文件插入/值中不支持 TOK_TABLE_OR_COL 类型的表达式 org.apache.hive.service.cli.operation.Operation.toSQLException(Operation.java:326) org.apache.hive.service.cli.operation.SQLOperation.prepare(SQLOperation.java:102) org.apache.hive.service.cli.operation.SQLOperation.runInternal(SQLOperation.java:171) org.apache.hive.service.cli.operation.Operation.run(Operation.java:268) org.apache.hive.service.cli.session.HiveSessionImpl.executeStatementInternal(HiveSessionImpl.java:410) org.apache.hive.service.cli.session.HiveSessionImpl.executeStatementAsync(HiveSessionImpl.java:397) sun.reflect.GeneratedMethodAccessor24.invoke(未知来源) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) java.lang.reflect.Method.invoke(Method.java:606) org.apache.hive.service.cli.session.HiveSessionProxy.invoke(HiveSessionProxy.java:78) org.apache.hive.service.cli.session.HiveSessionProxy.access$000(HiveSessionProxy.java:36) org.apache.hive.service.cli.session.HiveSessionProxy$1.run(HiveSessionProxy.java:63) java.security.AccessController.doPrivileged(本机方法) javax.security.auth.Subject.doAs(Subject.java:415) org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1671) org.apache.hive.service.cli.session.HiveSessionProxy.invoke(HiveSessionProxy.java:59) com.sun.proxy.$Proxy25.executeStatementAsync(未知来源) org.apache.hive.service.cli.CLIService.executeStatementAsync(CLIService.java:258) org.apache.hive.service.cli.thrift.ThriftCLIService.ExecuteStatement(ThriftCLIService.java:509) org.apache.hive.service.cli.thrift.TCLIService$Processor$ExecuteStatement.getResult(TCLIService.java:1313) org.apache.hive.service.cli.thrift.TCLIService$Processor$ExecuteStatement.getResult(TCLIService.java:1298) org.apache.thrift.ProcessFunction.process(ProcessFunction.java:39) org.apache.thrift.TBaseProcessor.process(TBaseProcessor.java:39) org.apache.hive.service.auth.TSetIpAddressProcessor.process(TSetIpAddressProcessor.java:56) org.apache.thrift.server.TThreadPoolServer$WorkerProcess.run(TThreadPoolServer.java:285) java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) java.lang.Thread.run(Thread.java:745)

我的插入查询

result = name+","+age+","+job;
String stmt = "INSERT INTO table real_estate.addressinformation_orc VALUES(" + result + ")";

我们将不胜感激。

【问题讨论】:

    标签: hadoop jdbc hive orc bigdata


    【解决方案1】:

    您需要引用字符串。假设年龄是一个整数,这会起作用,但这是一个糟糕的解决方案:

    result = "'" + name + "'," + age + ",'" + job + "'"
    

    这是一个基本的解决方案,因为如果姓名和职位包含引号,那会破坏您的代码。 一个更好的解决方案是使用准备好的语句。使用准备好的语句,您不必担心引用:

    preparedStatement = dbConnection.
      prepareStatement("INSERT INTO table " +     
        "real_estate.addressinformation_orc VALUES(?,?,?)");
    
    preparedStatement.setString(1, name);
    preparedStatement.setInt(2, age);
    preparedStatement.setString(3, job);
    
    // execute insert SQL stetement
    preparedStatement.executeUpdate();
    

    【讨论】:

      【解决方案2】:

      您需要在字符串引号中添加结果变量。

      例如: 插入表 test1(sno,name) 值 (1,jj);

      上面的行会抛出错误,如果我们编辑下面的内容,它会起作用

      插入表 test1(sno,name) 值 (1,"jj");

      这里名称数据类型是字符串

      【讨论】:

        【解决方案3】:

        是的,你需要引用字符串,否则它会抛出同样的错误。

        【讨论】:

        • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
        • 这在其他答案中已经提到了。
        猜你喜欢
        • 1970-01-01
        • 2014-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多