Spark Cache на самом деле не кешируется? - PullRequest
0 голосов
/ 25 сентября 2019

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 statisticsA и statisticB не совпадают, даже если они оба являются действительными статистическими данными.

Я сомневаюсь, что при использовании rowHeaderRdd каким-то образом headerRdd пересчитывается вместо загрузки из cache.Я говорю это потому, что когда я перешел к детерминированному header_id созданию, проблема исчезла - я думал, что были некоторые потери производительности.

  • Есть ли логическая причина того, почему это происходит?
  • Должен ли я тогда никогда не использовать кеш на чем-то, что не является детерминированным?
  • Есть ли другой метод, который я могу использовать?

Дополнительная информация:

В плане я вижу, что использовался InMemoryTableScan, но результаты показывают иначе.

У меня были проблемы с репликацией этого набора данных меньшего размера.Эта проблема с большей вероятностью возникает при использовании большего количества данных.

Версии Spark, на которых я пытался это сделать:

  • 2.4.2
  • 2.3.2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...