2016-09-06 5 views
0

У меня есть таблица с 4 миллионами записей и новые данные поступают ежедневно, и мне нужно обновить таблицу после обработки новых данных. В настоящее время я делаю это для этой цели. Я использую scala.Быстрое обновление от Spark Mysql

val batchSize = 1000 
df.rdd mapPartitions (_ grouped batchSize) foreach { batch => 
    { 
    val connection = getConnection(); 
    val statement = connection.createStatement(); 
    batch.foreach { row => 
     val query = "UPDATE temp SET file_name='" + row.get(0) + " WHERE id=" + row.get(3); 
     statement.executeUpdate(query); 

    } 
    connection.close(); 
    } 
} 

Это не точный запрос, но я делаю вот так. Для обновления таблицы требуется около 1 часа. Мне нужно улучшить производительность. Как я могу достичь производительности.

ответ

1
  1. Если база данных SQL не проиндексирована, добавьте индексы в соответствии с полем row.get (3).
  2. Если база данных SQL не InnoDB, сделать его InnoDB - InnoDB лучше для параллельных операций (необходимых для параллельности)

Похоже, сопутствующей часть с искрой производятся правильно и дальнейшие оптимизации должны быть сделаны из инфраструктуры (база данных в этом случае)

+0

Да Я использую innoDB, а также индекс на ключ, но максимальные обновления в секунду - от 6000 до 7000, а на столе с 4 миллионами строк - около 11 минут. –

+0

@AtifShahzad вы можете попробовать продолжить распараллеливание 'batch', какой тип данных это? вы можете использовать ключевое слово 'par' следующим образом:' (от 1 до 10000) .toArray.par' –

+0

пакетный тип данных Seq [Row] –

Смежные вопросы