Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 火花结构Delta流情况下的下推滤波器_Apache Spark_Delta Lake - Fatal编程技术网

Apache spark 火花结构Delta流情况下的下推滤波器

Apache spark 火花结构Delta流情况下的下推滤波器,apache-spark,delta-lake,Apache Spark,Delta Lake,我有一个用例,在这个用例中,我们需要将开源增量表流式传输到多个查询中,并在其中一个分区列上进行过滤。 如,。 给定按年份列分区的增量表 Streaming query 1 spark.readStream.format("delta").load("/tmp/delta-table/"). where("year= 2013") Streaming query 2 spark.readStream.format("delta

我有一个用例,在这个用例中,我们需要将开源增量表流式传输到多个查询中,并在其中一个分区列上进行过滤。 如,。 给定按年份列分区的增量表

Streaming query 1
spark.readStream.format("delta").load("/tmp/delta-table/").
where("year= 2013")

Streaming query 2
spark.readStream.format("delta").load("/tmp/delta-table/").
where("year= 2014")
物理计划显示流式传输后的过滤器

> == Physical Plan == Filter (isnotnull(year#431) AND (year#431 = 2013))
> +- StreamingRelation delta, []
我的问题是,下推谓词是否适用于Delta中的流式查询?
我们是否可以从增量中只传输特定的分区?

如果列已经分区,则只扫描所需的分区

让我们创建分区和非分区增量表,并执行结构化流

> == Physical Plan == Filter (isnotnull(year#431) AND (year#431 = 2013))
> +- StreamingRelation delta, []
分区增量表流:

val spark = SparkSession.builder().master("local[*]").getOrCreate()
spark.sparkContext.setLogLevel("ERROR")
import spark.implicits._
    
//sample dataframe
val df = Seq((1,2020),(2,2021),(3,2020),(4,2020),
(5,2020),(6,2020),(7,2019),(8,2019),(9,2018),(10,2020)).toDF("id","year")
    
//partionBy year column and save as delta table
df.write.format("delta").partitionBy("year").save("delta-stream")
    
//streaming delta table
spark.readStream.format("delta").load("delta-stream")
.where('year===2020)
.writeStream.format("console").start().awaitTermination()
df.write.format("delta").save("delta-stream")

spark.readStream.format("delta").load("delta-stream")
    .where('year===2020)
    .writeStream.format("console").start().awaitTermination()
上述流式查询的物理计划:请注意partitionFilters

非分区增量表流:

val spark = SparkSession.builder().master("local[*]").getOrCreate()
spark.sparkContext.setLogLevel("ERROR")
import spark.implicits._
    
//sample dataframe
val df = Seq((1,2020),(2,2021),(3,2020),(4,2020),
(5,2020),(6,2020),(7,2019),(8,2019),(9,2018),(10,2020)).toDF("id","year")
    
//partionBy year column and save as delta table
df.write.format("delta").partitionBy("year").save("delta-stream")
    
//streaming delta table
spark.readStream.format("delta").load("delta-stream")
.where('year===2020)
.writeStream.format("console").start().awaitTermination()
df.write.format("delta").save("delta-stream")

spark.readStream.format("delta").load("delta-stream")
    .where('year===2020)
    .writeStream.format("console").start().awaitTermination()
上述流式查询的物理计划:请注意pushedFilters


您使用的是开源版本还是Databricks版本?OSS中不存在下推过滤器。更新问题以提及开源版本。@AmitJoshi-开源您能告诉我使用的Delta core版本吗?spark 3.0.1和Delta core 0.7.0我不确定,但我看不到推送的过滤器。你能把代码贴在打印执行计划的地方吗。可能对我来说它被截断了。