基于时间的目录结构Apache Drill

时间:2017-09-16 01:02:09

标签: hadoop apache-spark hive apache-drill presto

我有按日期和时间组织的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 个答案:

答案 0 :(得分:0)

使用数据文件中的列进行查询无助于分区修剪。

您可以在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(dir0dir1dir2)到trans列名称和查询来定义视图。

有关详细信息,请参见下文。

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