복붙노트

[HADOOP] JDBC를 통한 Spark SQL과 Apache Drill 통합

HADOOP

JDBC를 통한 Spark SQL과 Apache Drill 통합

Apache Drill을 사용하여 HDFS의 CSV 데이터를 통해 수행 된 쿼리의 결과에서 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에서 큰 따옴표 안에 필드를 묶습니다. 이는 드릴에서 지원하지 않는 항목이므로 쿼리가 실패합니다.

누군가가이 통합 작업을 할 수 있었습니까?

고맙습니다!

해결법

  1. ==============================

    1.jdbc connector를 사용하기 전에 JDBC Dialect를 추가하고 dialect를 등록 할 수있다.

    jdbc connector를 사용하기 전에 JDBC Dialect를 추가하고 dialect를 등록 할 수있다.

    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)
    
  2. from https://stackoverflow.com/questions/35476076/integrating-spark-sql-and-apache-drill-through-jdbc by cc-by-sa and MIT license