通过JDBC集成Spark SQL和Apache Drill

时间:2016-02-18 08:15:29

标签: hadoop jdbc apache-spark apache-spark-sql apache-drill

我想使用Apache Drill从CSV数据(在HDFS上)执行的查询结果中创建Spark SQL DataFrame。我成功配置了Spark SQL,使其通过JDBC连接到Drill:

Map<String, String> connectionOptions = new HashMap<String, String>();
connectionOptions.put("url", args[0]);
connectionOptions.put("dbtable", args[1]);
connectionOptions.put("driver", "org.apache.drill.jdbc.Driver");

DataFrame logs = sqlc.read().format("jdbc").options(connectionOptions).load();

Spark SQL执行两个查询:第一个获取模式,第二个查询实际数据:

SELECT * FROM (SELECT * FROM dfs.output.`my_view`) WHERE 1=0

SELECT "field1","field2","field3" FROM (SELECT * FROM dfs.output.`my_view`)

第一个是成功的,但在第二个中Spark包含双引号内的字段,这是Drill不支持的内容,因此查询失败。

有人设法让这种集成工作吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

您可以为此添加JDBC Dialect并在使用jdbc连接器之前注册方言

case object DrillDialect extends JdbcDialect {

  def canHandle(url: String): Boolean = url.startsWith("jdbc:drill:")

  override def quoteIdentifier(colName: java.lang.String): java.lang.String = {
    return colName
  }

  def instance = this
}

JdbcDialects.registerDialect(DrillDialect)

答案 1 :(得分:0)

这是接受的答案代码在 Java 中的样子:

import org.apache.spark.sql.jdbc.JdbcDialect;

public class DrillDialect extends JdbcDialect {
  @Override
  public String quoteIdentifier(String colName){
    return colName;
  }

  public boolean canHandle(String url){
    return url.startsWith("jdbc:drill:");
  }
}

在创建 Spark 会话之前注册方言:

import org.apache.spark.sql.SparkSession;
import org.apache.spark.sql.jdbc.JdbcDialects;

public static void main(String[] args) {
    JdbcDialects.registerDialect(new DrillDialect());
    SparkSession spark = SparkSession
      .builder()
      .appName("Drill Dialect")
      .getOrCreate();

     //More Spark code here..

    spark.stop();
}

使用 Spark 2.3.2 和 Drill 1.16.0 进行尝试和测试。希望对你也有帮助!