问题描述
根据我的阅读,spark predict push down 将用于源端(减少数据扫描)。
- EMR 5.32.x
- Spark 版本 - 2.4.5
- Hive 版本 - 2.x
- 数据量超过 2 TB。
我有由另一个功能团队创建的 hive/spark 表。他们还在这张桌子的顶部创建了视图。 源表和视图的唯一区别是create_date列数据类型
- 基表 -> create_date -> 日期
- 查看 -> 创建日期 -> 时间戳
基表查询:
spark.sql("""select company_id,create_date
from `db`.`table` where product_name = 'sm' and
create_date = cast('2018-07-01' as date) and country ='selva'""").explain(True)
物理计划
== 物理计划 ==
*(1) 项目 [company_id#1993L,create_date#1997]
+- *(1) 过滤器 (((isnotnull(create_date#1997) && isnotnull(country#2003)) && (create_date#1997 = 17713)) &&
(country#2003 = selva)) +- *(1) FileScan 镶木地板
db.table[company_id#1993L,create_date#1997,country#2003,product_name#2080]
批处理:true,格式:Parquet,位置:
PrunedInMemoryFileIndex[s3://location...,PartitionFilters: [isnotnull(product_name#2080),(product_name#2080 =
sm)],PushedFilters: [IsNotNull(create_date),IsNotNull(country),EqualTo(create_date,2018-07-01),Equ...,阅读架构:
struct
查看查询:
spark.sql(
"""
select
create_date
from db.view where
product_name = 'sm' and country ='United States'
"""
).filter("cast(create_date as date) = cast('2018-07-01' as date)").explain(True)
== 物理计划 ==
*(1) 项目 [cast(create_date#2176 as timestamp) AS create_date#2087]
+- *(1) 过滤器 (((isnotnull(country#2182) && isnotnull(create_date#2176)) && (country#2182 = United
状态)) && (cast(cast(create_date#2176 as timestamp) as date)
= 17713)) +- *(1) FileScan parquet db.table[create_date#2176,country#2182,product_name#2259]
批处理:true,格式:Parquet,位置:
PrunedInMemoryFileIndex[s3://location...,PartitionFilters: [isnotnull(product_name#2259),(product_name#2259 =
sm)],PushedFilters: [IsNotNull(country),IsNotNull(create_date),EqualTo(country,United States)],ReadSchema: struct
或
spark.sql(
"""
select
create_date
from db.table where
product_name = 'sm' and country ='United States'
"""
).filter("create_date = cast('2018-07-01' as timestamp)").explain(True)
物理计划:
== 物理计划 ==
*(1) 项目 [cast(create_date#2354 作为时间戳) AS create_date#2265]
+- *(1) 过滤器 (((isnotnull(create_date#2354) && isnotnull(country#2360)) && (country#2360 = United States)) &&
(cast(create_date#2354 作为时间戳) = 1530403200000000))
+- *(1) FileScan parquet db.table[create_date#2354,country#2360,product_name#2437]
批处理:true,格式:Parquet,位置:
PrunedInMemoryFileIndex[s3:location..,PartitionFilters: [isnotnull(product_name#2437),(product_name#2437 =
sm)],ReadSchema:
struct
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)