rellocs wood
rellocs wood

Reputation: 1481

How to query druid data from java?

I know druid have scala/php client ,but I'm using java and I don't want to query the druid DB through HTTP directly, is any java druid-client available ?

Upvotes: 1

Views: 3826

Answers (5)

Collin Krawll
Collin Krawll

Reputation: 2520

Here's how to Query Druid using JDBC and Calcite Avatica:

Add Calcite Avatica

Add Calcite Avatica to your POM:

...
<dependency>
    <groupId>org.apache.calcite.avatica</groupId>
    <artifactId>avatica</artifactId>
    <version>1.21.0</version>
</dependency>
...

Example Code

//  ---------- Set up the Connection -------- //
String url = "jdbc:avatica:remote:url=https://example.com:8888/druid/v2/sql/avatica/";
Properties properties = new Properties();
properties.setProperty("user", "myusername");
properties.setProperty("password", "mypassword");
Connection conn = DriverManager.getConnection(url, properties);

//  --------------- Query Druid ------------- //
String sql = 
    "SELECT page, COUNT(*) AS Edits \n"
    + "FROM \"wikipedia\" \n"
    + "WHERE \"__time\" BETWEEN TIMESTAMP '2015-09-12 00:00:00' AND TIMESTAMP '2015-09-13 00:00:00' \n"
    + "GROUP BY page \n"
    + "ORDER BY Edits DESC \n"
    + "LIMIT 10";
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);

// Do something with the query results here.

See the docs here: https://druid.apache.org/docs/latest/querying/sql.html#jdbc

Upvotes: 0

ShashankNiranjan
ShashankNiranjan

Reputation: 94

Here is a simple Spring Boot Java Application which queries Druid data using Avatica JDBC Driver and prints the first row from the query.

Assuming that Druid is running in local and you already have data in a table name "druid_table" which has a column sourceIP

FlinkDruidApplication.java

@SpringBootApplication
public class FlinkDruidApplication {

    public static void main(String[] args) {
        SpringApplication.run(FlinkDruidApplication.class, args);
        Logger log = LoggerFactory.getLogger("FlinkDruidApplication");
        ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
        DataSet<Row> dbData =
                env.createInput(
                        JDBCInputFormat
                                .buildJDBCInputFormat()
                                .setDrivername("org.apache.calcite.avatica.remote.Driver")
                                .setDBUrl("jdbc:avatica:remote:url=http://localhost:8082/druid/v2/sql/avatica/")
                                .setUsername("null")
                                .setPassword("null")
                                .setQuery(
                                        "SELECT sourceIP FROM druid_table"
                                )
                                .setRowTypeInfo((RowTypeInfo) Types.ROW(Types.STRING))
                                .finish()
                );

        try {

            log.info("Printing first IP :: {} " + dbData.collect().iterator().next());
        } catch (Exception e) {
            log.error(e.getMessage());
        }


    }

}

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.8.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.shashank</groupId>
    <artifactId>FlinkDruid</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>FlinkDruid</name>
    <description>Flink Druid Connection</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.flink/flink-core -->
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-core</artifactId>
            <version>1.9.0</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.flink/flink-streaming-java -->
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-streaming-java_2.12</artifactId>
            <version>1.9.0</version>
            <scope>provided</scope>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.flink/flink-java -->
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-java</artifactId>
            <version>1.9.0</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.flink/flink-clients -->
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-clients_2.12</artifactId>
            <version>1.9.0</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.flink/flink-jdbc -->
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-jdbc_2.12</artifactId>
            <version>1.8.1</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.calcite.avatica/avatica-core -->
        <dependency>
            <groupId>org.apache.calcite.avatica</groupId>
            <artifactId>avatica-core</artifactId>
            <version>1.15.0</version>
        </dependency>


    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

Upvotes: 1

Ankita Singh
Ankita Singh

Reputation: 39

you can also use druidry, Java based utility library

Upvotes: 1

Jainik
Jainik

Reputation: 2452

Please checkout DruidDry. It's a java-based utility library to query druid.

Druid dry provides support to write query json and query to broker node using Java API. Currently it does not support few complex JSONs and also does not support ingestion spec. However it does support most common operations such as select, scan, group by etc.

Your project needs to run on Java 8 or greater in order to work with druid dry client.

Upvotes: 2

Gian Merlino
Gian Merlino

Reputation: 69

The simplest thing is probably Druid SQL over JDBC.

Upvotes: 0

Related Questions