问题描述
我已经设置了 Apache Drill,创建了 http 存储插件并将其配置设置如下:
{
"type": "http","cacheResults": false,"connections": {
"accounts": {
"url": "https://my.datasource.url","method": "GET","headers": {
"Authorization": "Bearer access_token...","Accept": "application/json"
},"authType": "none","userName": null,"password": null,"postBody": null,"params": null,"dataPath": "QueryResponse/Account","requireTail": false,"inputType": "json"
}
},"timeout": 0,"proxyHost": null,"proxyPort": 0,"proxyType": "direct","proxyUsername": null,"proxyPassword": null,"enabled": true
}
我可以通过 rest 调用(以及来自 web ui 和 odbc)运行查询,如下所示:
{
"queryType": "sql","query": "select * from myds.accounts"
}
问题是,访问令牌的生命周期很短,多个用户需要使用自己的访问令牌访问这些数据源,因此通过连接保存令牌对我不起作用。
有什么办法可以在发送查询时从客户端发送访问令牌?我不喜欢使用 Rest API 或 ODBC,它们中的任何一个都可以解决我的问题。谢谢
解决方法
可能在查询时指定一些配置。下面的示例演示了在文件系统插件中如何使用 table()
函数在运行时更改配置选项。在本例中,我们指定要在 Excel 文件中查询哪个工作表。
SELECT *
FROM table(dfs.`excel/test_data.xlsx` (type => 'excel',sheetName =>'secondSheet'))
我不知道这是否适用于 REST 插件,但值得一试。 (无可否认,这有点像黑客)
另一个需要修改插件的选项是创建可以在查询时指定的特殊变量。例如,我们可以创建一个 _headers
变量,以便您可以在查询时将项目插入到标题中。因此,查询可能如下所示:
SELECT...
FROM ...
WHERE _headers="Authorization=1234"
我真的想知道实现这一目标的最佳方法是什么。我确定您不是唯一遇到此问题的人。