基于时间的目录结构 Apache Drill

Posted

技术标签:

【中文标题】基于时间的目录结构 Apache Drill【英文标题】:Time based directory structure Apache Drill 【发布时间】:2018-02-25 05:01:09 【问题描述】:

我有按日期和时间组织的 CSV 文件,如下所示

logs/YYYY/MM/DD/CSV files...

我已设置 Apache Drill 以在这些 CSV 文件之上执行 SQL 查询。由于CSV文件很多;文件的组织可用于优化性能。例如,

SELECT * from data where trans>='20170101' AND trans<'20170102';

在此 SQL 中,应扫描目录 logs/2017/01/01 以查找数据。有没有办法让 Apache Drill 基于这个目录结构做优化?是否可以在 Hive、Impala 或任何其他工具中执行此操作?

请注意:

SQL 查询几乎总是包含时间范围。 给定目录中的 CSV 文件数量并不多。结合所有年份的数据,这将是巨大的 每个 CSV 文件中都有一个名为“trans”的字段,其中包含日期和时间。 CSV 文件根据“trans”字段的值放置在适当的目录下。 CSV 文件不遵循任何架构。列可能不同,也可能不同。

【问题讨论】:

【参考方案1】:

使用数据文件中的列查询对分区修剪没有帮助。

您可以在 Drill 中使用 dir* 变量来引用表中的分区。

create view trans_logs_view as 
select
 `dir0` as `tran_year`,
 `dir1` as `trans_month`,
 `dir2` as `tran_date`, * from dfs.`/data/logs`;

您可以使用 tran_year、tran_month 和 tran_date 列进行分区修剪。

还可以查看以下查询是否有助于修剪。

select count(1)  from dfs.`/data/logs` 
where concat(`dir0`,`dir1`,`dir2`) between '20170101' AND '20170102';

如果是这样,您可以通过别名 concat(dir0,dir1,dir2) 到 trans 列名和查询来定义视图。

详情请见下文。

https://drill.apache.org/docs/how-to-partition-data/

【讨论】:

不确定这个答案有什么不喜欢的地方,谢谢! 我使用了您的建议并创建了一个视图,除了我必须将 dir0 转换为 int 以便能够在与其他表的连接中使用该字段。您是否有机会知道这是否会维持分区修剪或是否会破坏它?如果你想插话,这是我的问题:***.com/questions/67929849/…

以上是关于基于时间的目录结构 Apache Drill的主要内容,如果未能解决你的问题,请参考以下文章

存储插件配置持久性不适用于 Apache Drill

使用 Apache Drill 查询嵌套的复杂 json 结构

为啥在嵌入式模式下尝试启动 apache Drill 时出现错误?

Apache Drill 的 JPAM 配置

使用 Apache Drill

Apache Drill - 以嵌入式模式连接到 Drill [java]