PushedFilters前面的星号在Spark SQL解释计划中意味着什么

PushedFilters前面的星号在Spark SQL解释计划中意味着什么,sql,apache-spark,filter,Sql,Apache Spark,Filter,关于Spark Physical Explain Plans中显示的火花推动式过滤器,其说明如下:。 : 星号表示只在数据源级别处理下推筛选器 这意味着什么?更重要的是,当您看到PushedFilters数组条目没有星号时, 过滤器是否仍被下推到数据源级别并在其外部处理,但是 那么,首先为什么称之为推式过滤器呢 我很困惑,在谷歌上搜索,找不到这个问题的真正答案 谢谢 Jan谓词的下推总是发生在数据源级别。发生这种情况的方式是,数据源将有选择地扫描预测的数据片段。Spark只是一个处理引擎,它将查

关于Spark Physical Explain Plans中显示的火花推动式过滤器,其说明如下:。 :

星号表示只在数据源级别处理下推筛选器

这意味着什么?更重要的是,当您看到PushedFilters数组条目没有星号时, 过滤器是否仍被下推到数据源级别并在其外部处理,但是 那么,首先为什么称之为推式过滤器呢

我很困惑,在谷歌上搜索,找不到这个问题的真正答案

谢谢


Jan

谓词的下推总是发生在数据源级别。发生这种情况的方式是,数据源将有选择地扫描预测的数据片段。Spark只是一个处理引擎,它将查询交给数据源进行最终执行。另一方面,数据源将按照自己的意愿执行查询。Spark sql连接器可以根据模式了解数据源的行为,因此可以使用下推谓词预测物理计划,但不能保证它会运行,因此星号为

我对一个本地拼花文件进行了查询。物理计划已下推谓词且没有星号。这是Spark读取的本地拼花文件,因此物理平面图100%准确

    val df = spark.read.parquet("/Users/Documents/temp/temp1")
    df.filter($"income" >= 30).explain(true)


== Physical Plan ==
*(1) Project [client#0, type#1, address#2, type_2#3, income#4]
+- *(1) Filter (isnotnull(income#4) && (income#4 >= 30))
   +- *(1) FileScan parquet [client#0,type#1,address#2,type_2#3,income#4] Batched: true, Format: Parquet, Location: InMemoryFileIndex[file:/User/Documents/temp/temp1], PartitionFilters: [], PushedFilters: [IsNotNull(income), GreaterThanOrEqual(income,30)], ReadSchema: struct<client:string,type:string,address:string,type_2:string,income:int>

这里使用Spark SQL从Oracle读取一个表。OracleDB使用谓词下推和索引访问,但Spark对此一无所知

== Physical Plan ==
Execute InsertIntoHadoopFsRelationCommand InsertIntoHadoopFsRelationCommand file:/data/.., false, Parquet, Map(codec -> org.apache.hadoop.io.compress.snappyCodec, path -> /data/...), Overwrite, [COLUMN_01, COLUMN_02, COLUMN_03, COLUMN_04, COLUMN_05, COLUMN_06, COLUMN_07, COLUMN_08, COLUMN_09, COLUMN_10, COLUMN_11, COLUMN_12, COLUMN_13, COLUMN_14, COLUMN_15, COLUMN_16, COLUMN_17, COLUMN_18, ... 255 more fields]
+- Project [COLUMN_01#1246, COLUMN_02#1247, COLUMN_03#1248, COLUMN_04#1249, COLUMN_05#1250, COLUMN_06#1251, COLUMN_07#1252, COLUMN_08#1253, COLUMN_09#1254, COLUMN_10#1255, COLUMN_11#1256, COLUMN_12#1257, COLUMN_13#1258, COLUMN_14#1259, COLUMN_15#1260, COLUMN_16#1261, COLUMN_17#1262, COLUMN_18#1263, ... 255 more fields]
   +- Scan JDBCRelation((select cu.*, ROWIDTONCHAR(t.rowid) as ROW_ID from table t  where (column1 in (786567473,786567520,786567670,786567570,...........)) and column2 in (10,11, ...) and t.result is null)t) [numPartitions=20] [COLUMN_87#1332,COLUMN_182#1427,COLUMN_128#1373,COLUMN_104#1349,COLUMN_189#1434,COLUMN_108#1353,COLUMN_116#1361,COLUMN_154#1399,COLUMN_125#1370,COLUMN_120#1365,COLUMN_267#1512,COLUMN_54#1299,COLUMN_100#1345,COLUMN_230#1475,COLUMN_68#1313,COLUMN_44#1289,COLUMN_53#1298,COLUMN_97#1342,COLUMN_03#1248,COLUMN_16#1261,COLUMN_43#1288,COLUMN_50#1295,COLUMN_174#1419,COLUMN_20#1265,... 254 more fields] PushedFilters: [], ReadSchema: struct<COLUMN_87:string,COLUMN_182:string,COLUMN_128:string,COLUMN_104:string,COLUMN_189:string,C...

谢谢萨利姆的回复!没有星号的下推过滤器,这是什么意思?我在这篇文章中读到,没有星号的下推过滤器执行速度较慢,我想知道这是否是有星号和没有星号的区别。想象一下两个数据源——一个本地拼花文件和一个数据库上的删除表。Spark将读取文件本身,而Spark将依赖数据库读取数据。与从远程数据库读取的计划相比,读取本地拼花地板文件的计划没有星号。嗨,Salim,我认为第二个物理计划有一个空的下推筛选器数组PushedFilters:[],因为它是一个没有where子句的insert。我注意到在我们的物理解释计划中,isnotnull过滤器没有*号,它在SQL查询where子句中没有任何对等项,但由Spark本身插入,而我们在SQL查询中的实际where子句得到*号。例如:PushedFilters:[IsNotNullTYPE,*EqualToTYPE,BAR]我仍然不知道这两个过滤器是如何执行/按下的对不起!::@JB007这就是我的观点,当数据源读取Spark的数据时,Spark不知道执行,例如Oracle DB。当Spark读取本地拼花文件时,它可以准确地告诉数据将如何读取。对于像Cassandra这样的特殊数据连接器,Spark对执行有更好的想法,但同样不能保证执行,因此使用*。