【问题标题】:Integrating Spark SQL and Apache Drill through JDBC通过 JDBC 集成 Spark SQL 和 Apache Drill
【发布时间】:2016-05-30 07:13:15
【问题描述】:

我想根据使用 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 不支持的,因此查询失败。

有人设法使这种集成正常工作吗?

谢谢!

【问题讨论】:

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


    【解决方案1】:

    这是接受的答案代码在 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 进行了尝试和测试。希望对你也有帮助!

    【讨论】:

      【解决方案2】:

      您可以为此添加 JDBC 方言并在使用 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)
      

      【讨论】:

      • 这看起来像 Scala,但 OP 的问题是在 Java 中。
      • 没错,我仍然接受答案,因为它指向了 JdbcDialect。谢谢!
      • 请您发布代码的 pyspark 版本吗?
      猜你喜欢
      • 1970-01-01
      • 2020-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-29
      • 2015-04-30
      • 1970-01-01
      相关资源
      最近更新 更多