我想使用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不支持的内容,因此查询失败。
有人设法让这种集成工作吗?
谢谢!
答案 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 进行尝试和测试。希望对你也有帮助!