У меня есть очень большая таблица в Кассандре (~ 500 мил), и я хочу экспортировать все строки для некоторых столбцов в файл. Я попытался это с помощью команды COPY с:
COPY keyspace.table (id, value) TO 'filepath' WITH DELIMITER=',';
но для завершения экспорта потребовалось ~ 12 часов. Есть ли возможность сделать это быстрее?
Если проблема состоит в том, чтобы просто экспортировать некоторые столбцы, не будет проблемой экспортировать все данные. Важно то, что мне нужен способ получить все записи, которые я могу продолжить после.
Другой вопрос, возможно ли обработать этот экспорт в PHP только с драйвером DataStax PHP?
СКОПИРОВАТЬ В … не очень хорошая идея использовать на большом количестве данных.
Можно ли обработать этот экспорт в PHP только с драйвером DataStax PHP
Я сделал экспорт CSV из Cassandra с помощью драйвера Datastax Java, но PHP должен иметь тот же алгоритм. В соответствии с документация Вы можете легко сделать запрос и распечатать вывод. Обратить внимание пагинация также.
Вы можете конвертировать массив в CSV с помощью fputcsv Funciton
Итак, самый простой пример будет:
<?php
$cluster = Cassandra::cluster() // connects to localhost by default
->build();
$keyspace = 'system';
$session = $cluster->connect($keyspace); // create session, optionally scoped to a keyspace
$statement = new Cassandra\SimpleStatement( // also supports prepared and batch statements
'SELECT keyspace_name, columnfamily_name FROM schema_columnfamilies'
);
$future = $session->executeAsync($statement); // fully asynchronous and easy parallel execution
$result = $future->get(); // wait for the result, with an optional timeout
// Here you can print CSV headers.
foreach ($result as $row) { // results and rows implement Iterator, Countable and ArrayAccess
// Here you can print CSV values
// printf("The keyspace %s has a table called %s\n", $row['keyspace_name'], $row['columnfamily_name']);
}
Короткий ответ — да, есть более быстрые способы сделать это.
Чем дольше ответ, если вы собираетесь сохранять эти строки в файл на регулярной основе — вы можете использовать Apache Spark. В зависимости от того, сколько памяти находится на ваших узлах Cassandra, вы можете выполнить простое сканирование таблицы строк на 500 миллионов => запись в файл до < 1 час.
Есть несколько вариантов, которые могут дать вам быстро & надежный оборот:
Для PHP [Hive PHP Client]:
<?php
// set THRIFT_ROOT to php directory of the hive distribution
$GLOBALS['THRIFT_ROOT'] = '/lib/php/';
// load the required files for connecting to Hive
require_once $GLOBALS['THRIFT_ROOT'] . 'packages/hive_service/ThriftHive.php';
require_once $GLOBALS['THRIFT_ROOT'] . 'transport/TSocket.php';
require_once $GLOBALS['THRIFT_ROOT'] . 'protocol/TBinaryProtocol.php';
// Set up the transport/protocol/client
$transport = new TSocket('localhost', 10000);
$protocol = new TBinaryProtocol($transport);
$client = new ThriftHiveClient($protocol);
$transport->open();
// run queries, metadata calls etc
$client->execute('SELECT * from src');
var_dump($client->fetchAll());
$transport->close();
Ref: https://cwiki.apache.org/confluence/display/Hive/HiveClient#HiveClient-PHP