在连接两个表时,在分区的Hive表上避免Spark中的全表扫描

时间:2017-05-10 22:33:53

标签: apache-spark join apache-spark-sql

我在Hive中存储了两个表,一个用于记录设备执行给定转换事件的时间,另一个用于保存所有设备上发生的所有事件的记录。

CREATE TABLE conversions (
  deviceid string,
  timestamp datetime,
  date string
)
CREATE TABLE event_log (
  deviceid string,
  timestamp datetime,
  date string
)  

日期字段以YYYYMMDD格式保存时间戳的日期部分,并且event_log表由此列分区。转换表很小(通常是100行),但event_log表很大,每天包含大约1500万行。

我想从event_log中提取设备在转换事件当天的历史记录。

我的第一次尝试如下:

select * from event_log a left semi join conversions b
on (a.deviceid = b.deviceid and a.date = b.date)

然而,这似乎在event_log上执行全表扫描,这使得查询非常慢。 Tez似乎能够有效地执行查询,而无需通过在加入之前过滤event_log来执行完整扫描。

在SparkSQL中执行此查询的规范方法是什么?我很乐意使用dataframe api,如果它更容易以该格式表示

0 个答案:

没有答案