6

在整个 Apache Drill 的 Wiki 中,我只能看到通过 SqlLine 客户端运行的查询。除了 REST API 之外,还有其他编程方式可以在 Drill 中运行查询吗?任何样本或指针?

还是和使用 JDBC 驱动程序运行 SQL 查询一样?

4

4 回答 4

2

您可以使用 Drill JDBC 驱动程序,该驱动程序在此处记录:http: //drill.apache.org/docs/using-the-jdbc-driver/

请注意,如果您使用 Maven 构建 Java 程序,则需要在本地安装 Drill 依赖项:

mvn install:install-file -Dfile=/opt/apache-drill-1.0.0/jars/drill-java-exec-1.0.0-rebuffed.jar -DgroupId=org.apache.drill.exec -DartifactId=drill-java-exec -Dversion=1.0.0 -Dpackaging=jar -DgeneratePom=true
mvn install:install-file -Dfile=/opt/apache-drill-1.0.0/jars/drill-common-1.0.0-rebuffed.jar -DgroupId=org.apache.drill -DartifactId=drill-common -Dversion=1.0.0 -Dpackaging=jar -DgeneratePom=true

这是一个例子:https ://github.com/vicenteg/DrillJDBCExample

于 2015-06-29T17:25:06.437 回答
2

仅对于 JDBC 部分,我在我的 Java 代码中使用了类似的东西 -

-------------
Dependency
-------------
    <dependency>
      <groupId>org.apache.drill.exec</groupId>
      <artifactId>drill-jdbc</artifactId>
      <version>1.1.0</version>
    </dependency>

----------
Testcase
----------
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Properties;

import org.apache.drill.exec.ExecConstants;
import org.apache.drill.jdbc.Driver;

import org.testng.Assert;
import org.testng.annotations.Test;

public class TestDrillJdbcDriver {

  /* Drill JDBC Uri for local/cluster zookeeper */
  public static final String DRILL_JDBC_LOCAL_URI = "jdbc:drill:zk=local";

  /* Sample query used by Drill */
  public static final String DRILL_SAMPLE_QUERY = "SELECT * FROM cp.`employee.json` LIMIT 20";


  @Test
  public void testDrillJdbcDriver() throws Exception {
    Connection con = null;

    try {
      con = new Driver().connect(DRILL_JDBC_LOCAL_URI, getDefaultProperties());
      Statement stmt = con.createStatement();
      ResultSet rs = stmt.executeQuery(DRILL_SAMPLE_QUERY);

      int count = 0;
      while (rs.next()) {
        System.out.println(rs.getString(1));
        System.out.println(rs.getString(2));
        System.out.println(rs.getString(3));
        count++;
      }
      Assert.assertEquals(count, 20, "Twenty rows were expected.");
    } catch (Exception ex) {
      System.out.println(ex);
    } finally {
      if (con != null) {
        con.close();
      }
    }
  }

  public static Properties getDefaultProperties() {
    final Properties properties = new Properties();
    properties.setProperty(ExecConstants.HTTP_ENABLE, "false");
    return properties;
  }
}
于 2015-08-01T20:06:14.753 回答
1

除了 sqlline 你可以使用

  1. 钻取 Web UI 以运行查询。本地(嵌入式)安装的默认端口为 8047。
  2. 或者下载并配置 MapR ODBC 驱动程序,它会附带可以使用的 Drill Explorer(另一个 UI)。 https://drill.apache.org/docs/installing-the-driver-on-windows/
  3. 或配置与 ODBC 一起使用的任何其他工具(我已将 Teradata SQL 助手配置为使用 MapR ODBC 驱动程序进行钻孔)
  4. JDBC 集成 - 使用 SQuirrel 或 DBVisualizer,您可以通过它们运行查询。 https://drill.apache.org/docs/using-jdbc-with-squirrel-on-windows/
  5. 以编程方式将通过 JDBC。(使用 Drill-jdbc-all-1.0.0jar 和 org.apache.drill.jdbc.Driver 类)
于 2015-06-25T20:22:46.280 回答
-2
Other way to execute query by Calling REST API in Apache Drill

公共类请求查询 {

private String queryType;
private String query;

public String getQueryType() {
    return queryType;
}
public void setQueryType(String queryType) {
    this.queryType = queryType;
}
public String getQuery() {
    return query;
}
public void setQuery(String query) {
    this.query = query;
}

}

import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.ramyam.eis.apache.drill.api.model.RequestQuery;

public class RestAPI {

    private static Log logger = LogFactory.getLog(RestAPI.class);
    public static void main(String[] args) {
        getQueryResponce();
    }

    private static void getQueryResponce(){
        Client client = null;
        WebTarget target = null;
        try {
            logger.info("---------Started execution-----------");
            RequestQuery query = new RequestQuery();
            query.setQueryType("SQL");
            //MySQL
            //query.setQuery("SELECT * FROM MYSQL.foodmart.collections");
            //query.setQuery("SELECT * FROM MYSQL.foodmart.collections limit 100");
            //query.setQuery("SELECT payment_due_from,NumItems FROM MYSQL.foodmart.collections limit 10");
            //query.setQuery("SELECT count(SPORTS_PREFERENCE) FROM MYSQL.foodmart.collections group by SPORTS_PREFERENCE");
            //query.setQuery("SELECT DISTINCT payment_due_from FROM MYSQL.foodmart.collections ");

            //Mongo DB
            //query.setQuery("select * from mongo.apache_drill.pt_BMS_preferences_data where SPORTS_PREFERENCE = 'Cricket' limit 10");
            //query.setQuery("SELECT COUNT(SPORTS_PREFERENCE) FROM mongo.apache_drill.pt_BMS_preferences_data GROUP BY SPORTS_PREFERENCE");
            query.setQuery("SELECT DISTINCT(SPORTS_PREFERENCE) FROM mongo.apache_drill.pt_BMS_preferences_data ");
            client = ClientBuilder.newClient();
            target = client.target("http://localhost:8047/query.json");
            //target = target.path(path);
            Response response = target.request().accept(MediaType.APPLICATION_JSON)
                    .post(Entity.json(query), Response.class);
            if (response.getStatus() != 200) {
                throw new RuntimeException("Failed : HTTP error code : " + response.getStatus());
            }
            String string = response.readEntity(String.class);
            logger.info(query.getQueryType()+"->"+query.getQuery());
            logger.info("Responce:\n"+string);
            logger.info("---------End execution-----------");
        } catch (Exception e) {
            e.printStackTrace();
            logger.error(e.getMessage(),e);
        }
    }
于 2017-08-30T12:38:31.603 回答