Spark缓存不是真的缓存吗?

时间:2019-09-25 03:51:57

标签: apache-spark

header sql中包含以下行:

select
    row_number() over(order by (select NULL)) as id,
    header.*
from header

我使用以下方法缓存数据集的结果:

Dataset<Row> headerRdd = spark.sql(header).cache();
headerRdd.createOrReplaceTempView("headerRdd");

headerRdd -> rowRdd之间使用确定性联接rowRdd中的每条记录都会得到header_id

select
    headerRdd.id as header_id,
    rowRdd.*
from headerRdd h
inner join rowRdd r on 
    h.foo = r.foo and
    h.start <= r.time and
    h.end >= r.time

结果是一个数据集rowHeaderRdd,该数据集随后用于计算各种统计信息(彼此之间互不建立的独立查询)。

我最终看到的是计算出的统计信息似乎与相同的header_id不匹配。

例如header_id = 1 statisticsAstatisticB都不匹配,即使它们都是有效的统计信息。

我的疑问是,在使用rowHeaderRdd时,将以某种方式重新计算headerRdd而不是从cache进行加载。我说这是因为,当我开始进行确定性 header_id创建时,问题就消失了-以为会有一些性能损失。

  • 发生这种情况是否有逻辑上的原因?
  • 然后我应该永远不要在不确定性的东西上使用缓存吗?
  • 还有其他我可以使用的技术吗?

其他信息:

在该计划中,我可以看到使用了InMemoryTableScan,但结果显示为相反。

我在将其复制到较小的数据集时遇到问题。使用更多数据时,发生此问题的可能性更高。

我尝试使用的Spark版本为:

  • 2.4.2
  • 2.3.2

0 个答案:

没有答案