Apache spark 在连接两个表时,避免在分区配置单元表上的Spark中进行完整表扫描

Apache spark 在连接两个表时,避免在分区配置单元表上的Spark中进行完整表扫描,apache-spark,join,apache-spark-sql,Apache Spark,Join,Apache Spark Sql,我在配置单元中存储了两个表,一个记录设备执行给定转换事件的时间,另一个保存所有设备上发生的所有事件的记录 CREATE TABLE conversions ( deviceid string, timestamp datetime, date string ) CREATE TABLE event_log ( deviceid string, timestamp datetime, date string ) 日期字段以YYYYMMDD格式保存时间戳的日期部分,事件

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

CREATE TABLE conversions (
  deviceid string,
  timestamp datetime,
  date string
)
CREATE TABLE event_log (
  deviceid string,
  timestamp datetime,
  date string
)  
日期字段以YYYYMMDD格式保存时间戳的日期部分,事件日志表由该列进行分区。转换表很小(通常为100行),但事件日志表很大,每天大约包含1500万行

我想从事件日志中提取设备发生转换事件当天的历史记录

我的第一次尝试如下

select * from event_log a left semi join conversions b
on (a.deviceid = b.deviceid and a.date = b.date)
然而,这似乎对事件日志执行了一次完整的表扫描,这使得查询速度非常慢。Tez似乎能够在加入之前通过过滤事件日志高效地执行查询,而无需执行完全扫描

在SparkSQL中执行此查询的规范方式是什么?我很乐意使用DataFrameAPI,如果它更容易用这种格式表达的话