select distinct filename from dfs.contoso.`folder/CSVs/`
> 2021-01.csv
> 2021-02.csv
> ...
或
select count(*) as cnt from dfs.contoso.`folder/CSVs/`
where filename = '2021-01.csv'
> 4562751239
问题是这两个查询都需要一个小时。从计划中可以明显看出,Drill 会遍历目标文件夹中的所有文件,然后按文件名过滤数据。这对于更大的数据集来说绝对不可用。
不幸的是,我无法更改数据结构,也无法在 from 子句中包含单个文件(from dfs.contoso.
folder/CSVs/2021-01.csv`),因为此时 Drill不使用我需要的创建的 CSV 架构。
Drill 这样做有什么原因吗? 我们怎样才能有效地做到这一点?
钻头 1.19
更新
主要问题不是枚举文件夹中的文件,而是从目录中的多个文件中读取单个文件的数据。
拥有这个文件系统:
CsvHistory/2019-01.csv [2GB]
CsvHistory/2019-02.csv [3GB]
...
CsvHistory/2021-09.csv [6GB]
我们需要直接从一个文件进行查询,不从文件夹中读取其他文件,并且不更改文件系统结构,因为这是不允许的。
我们需要此查询而不是遍历所有其他文件,因为这会极大地浪费性能。
最佳答案
很抱歉你放弃了 Drill,但我会把这篇文章发给可能正在阅读这篇文章的其他人。
您必须对 Drill 如何处理模式有所了解。首先,Drill 尝试从底层数据推断模式。对于上面列出的查询,看起来您正在尝试在给定目录中查找文件名并计算每个文件中的行数。这些都不需要模式。正如我提到的,您应该使用 INFORMATION_SCHEMA
查询目录或 SHOW FILES IN <dir>
查询那个。
提供架构
如果 Drill 推断的模式不适合您,您可以在查询时或通过运行 CREATE SCHEMA
向 Drill 提供模式。查询将创建一个隐藏的模式文件。这是该功能的文档链接:https://drill.apache.org/docs/create-or-replace-schema/ .我没有广泛使用此功能,但我知道您当然可以为单个文件提供模式文件。不确定整个目录,但我相信这是为了做到这一点。
内联模式的文档有点缺乏,但您也可以在查询时执行此操作,如下所示:
SELECT Year
FROM table(dfs.test.`test.csvh` (schema=>'inline=(`Year` int)'))
WHERE Make = 'Ford'
这里的结果是 Year
列将被解释为 INT
而不是默认的 VARCHAR
.
**更新:**事实证明,您还可以在 table()
中提供架构上面的功能。见下文
SELECT Year
FROM table(dfs.test.`test.csvh` (schema => 'path=`/path/to/schema`'))
WHERE Make = 'Ford'
关于apache-drill - Apache Drill 中的 WHERE filename 对所有文件进行全面扫描,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68849439/