Spark DataFrame Cache Большая таблица TempTable

У меня есть искровое приложение с очень большим Dataframe. В настоящее время я регистрирую фрейм данных как tempTable, поэтому я могу выполнить несколько запросов к нему.

Когда я использую RDD, я использую persist(StorageLevel.MEMORY_AND_DISK()), что эквивалентно tempTable.

Ниже приведены две возможности, я не думаю, что вариант 2 будет работать, потому что cacheTable пытается кэшировать в памяти, а моя таблица слишком велика, чтобы поместиться в памяти.

    DataFrame standardLocationRecords = inputReader.readAsDataFrame(sc, sqlc);

    // Option 1 //
    standardLocationRecords.persist(StorageLevel.MEMORY_AND_DISK());
    standardLocationRecords.registerTempTable("standardlocationrecords");

    // Option 2 //
    standardLocationRecords.registerTempTable("standardlocationrecords");
    sqlc.cacheTable("standardlocationrecords");

Как я могу лучше всего кэшировать свой temptable, чтобы я мог выполнять несколько запросов к нему без необходимости перезагрузки данных.

Спасибо, Натан


person Nath5    schedule 03.05.2016    source источник


Ответы (1)


Я только что просмотрел исходный код Spark 1.6.1, и на самом деле вариант 2 — это то, что вам нужно. Вот выдержка из комментария по кэшированию:

... В отличие от RDD.cache() уровень хранения по умолчанию установлен равным MEMORY_AND_DISK, потому что повторное вычисление столбцового представления базовой таблицы в памяти требует больших затрат.

  def cacheTable(tableName: String): Unit = {
    cacheManager.cacheQuery(table(tableName), Some(tableName))
  }

  private[sql] def cacheQuery(
      query: Queryable,
      tableName: Option[String] = None,
      storageLevel: StorageLevel = MEMORY_AND_DISK): Unit 

Справка:

https://github.com/apache/spark/blob/branch-1.6/sql/core/src/main/scala/org/apache/spark/sql/SQLContext.scala#L355

https://github.com/apache/spark/blob/branch-1.6/sql/core/src/main/scala/org/apache/spark/sql/execution/CacheManager.scala#L76

person radek1st    schedule 20.06.2016