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, на которых я пытался это сделать: