2016-09-04 56 views
0

我正在嘗試使用CSV創建基本流程序,使用CSV作爲數據源。我可以使用sqlline運行查詢,但是我無法以編程方式執行。我的代碼是:用Calcite創建流示例使用CSV

example.json

{ 
    version: '1.0', 
    defaultSchema: 'STREAM', 
    schemas: [ 
    { 
     name: 'SS', 
     tables: [ 
     { 
      name: 'ORDERS', 
      type: 'custom', 
      factory: 'org.apache.calcite.adapter.csv.CsvStreamTableFactory', 
      stream: { 
      stream: true 
      }, 
      operand: { 
      file: 'sales/SORDERS.csv', 
      flavor: "scannable" 
      } 
     } 
     ] 
    } 
    ] 
} 

SORDERS.csv

PRODUCTID:int,ORDERID:int,UNITS:int 
3,4,5 
2,5,12 
2,1,6 

SimpleQuery.java

package stream_test; 

import org.apache.calcite.adapter.java.ReflectiveSchema; 
import org.apache.calcite.jdbc.CalciteConnection; 
import org.apache.calcite.schema.SchemaPlus; 

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 
import java.util.Properties; 

/** 
* Example of using Calcite via JDBC. 
* 
* <p>Schema is specified programmatically.</p> 
*/ 
public class SimpleQuery { 
    public static void main(String[] args) throws Exception { 
    new SimpleQuery().run(); 
    } 

    public void run() throws ClassNotFoundException, SQLException { 
    Class.forName("org.apache.calcite.jdbc.Driver"); 
    Properties info = new Properties(); 
    info.setProperty("lex", "JAVA"); 
    Connection connection = 
     DriverManager.getConnection("jdbc:calcite:model=" 
       + "/home/hduser/Downloads/calcite-master/example/csv/target/test-classes/example.json",info); 
    CalciteConnection calciteConnection = 
     connection.unwrap(CalciteConnection.class); 
    //SchemaPlus rootSchema = calciteConnection.getRootSchema(); 
    //rootSchema.add("os", new ReflectiveSchema(new Os())); 
    Statement statement = connection.createStatement(); 
    ResultSet resultSet = 
      statement.executeQuery("select stream * from SS.ORDERS where SS.ORDERS.UNITS > 5"); 
    final StringBuilder buf = new StringBuilder(); 
    while (resultSet.next()) { 
     int n = resultSet.getMetaData().getColumnCount(); 
     for (int i = 1; i <= n; i++) { 
     buf.append(i > 1 ? "; " : "") 
      .append(resultSet.getMetaData().getColumnLabel(i)) 
      .append("=") 
      .append(resultSet.getObject(i)); 
     } 
     System.out.println(buf.toString()); 
     buf.setLength(0); 
    } 
    resultSet.close(); 
    statement.close(); 
    connection.close(); 
    } 

} 

最後我有方解石芯1.8.0的相關性, net.sf.opencsv 2.3,calcite-avatica 1.6.0,calcite-linq4j 1.8.0,sqlline 1.1.9,hamcrest-core 1.3,com.github.stephenc.jcip 1.0-1,comm ons-lang3 3.4,番石榴19.0 和導入的calcite-example-csv-1.9.0-SNAPSHOT(我從github版本中打包maven)。

當我嘗試運行代碼我得到:

Exception in thread "main" java.lang.NoSuchFieldError: CANCEL_FLAG 
    at org.apache.calcite.adapter.csv.CsvStreamScannableTable.scan(CsvStreamScannableTable.java:66) 
    at org.apache.calcite.interpreter.TableScanNode.createScannable(TableScanNode.java:117) 
    at org.apache.calcite.interpreter.TableScanNode.create(TableScanNode.java:94) 
    at org.apache.calcite.interpreter.Nodes$CoreCompiler.visit(Nodes.java:68) 
    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 org.apache.calcite.util.ReflectUtil.invokeVisitorInternal(ReflectUtil.java:257) 
    at org.apache.calcite.util.ReflectUtil.invokeVisitor(ReflectUtil.java:214) 
    at org.apache.calcite.util.ReflectUtil$1.invokeVisitor(ReflectUtil.java:471) 
    at org.apache.calcite.interpreter.Interpreter$Compiler.visit(Interpreter.java:476) 
    at org.apache.calcite.interpreter.Interpreter$Compiler.visitRoot(Interpreter.java:433) 
    at org.apache.calcite.interpreter.Interpreter.<init>(Interpreter.java:75) 
    at Baz.bind(Unknown Source) 
    at org.apache.calcite.jdbc.CalcitePrepare$CalciteSignature.enumerable(CalcitePrepare.java:327) 
    at org.apache.calcite.jdbc.CalciteConnectionImpl.enumerable(CalciteConnectionImpl.java:282) 
    at  package stream_test; 

關於如何解決它的任何想法?

回答

0

在Eclipse我使用:

如行家依賴關係: 公地-io的2.4,共享記錄1.1.3,公地lang3 3.2,JANINO 2.7.6,eigenbase-性質1.1.5,avatica 1.8。 0,opencsv 2.3,json-simple 1.1

和作爲外部罐子: calcite-core 1.9.0,example-csv-1.9.0,calcite-linq4j 1.9.0(所有SNAPSHOT版本)在用mvn創建它們之後從github最新版本的方解石安裝命令。

0

您有不匹配的庫(calcite-example-csv版本1.9.0-SNAPSHOT,與方案核心版本1.8.0)。有關更多詳情,請參閱the discussion on calcite dev list

+0

我在整個項目中使用了mvn install,並且在avatica文件夾中再次使用了mvn install。然後,我將其作爲外部jar文件導入爲calcite-example-csv,calcite-core,avatica,linq4j,avatica-metrics,avatica-standalone及其所有源代碼和測試,並且我得到:線程「main」中的異常java.lang.AbstractMethodError :org.apache.calcite.config.CalciteConnectionProperty.valueClass()Ljava/lang/Class; \t at org.apache.calcite.avatica.ConnectionConfigImpl $ PropEnv.getEnum(ConnectionConfigImpl.java:228)... – grtheod