Экспорт полной таблицы в CSV из Кассандры

У меня есть очень большая таблица в Кассандре (~ 500 мил), и я хочу экспортировать все строки для некоторых столбцов в файл. Я попытался это с помощью команды COPY с:

COPY keyspace.table (id, value) TO 'filepath' WITH DELIMITER=',';

но для завершения экспорта потребовалось ~ 12 часов. Есть ли возможность сделать это быстрее?

Если проблема состоит в том, чтобы просто экспортировать некоторые столбцы, не будет проблемой экспортировать все данные. Важно то, что мне нужен способ получить все записи, которые я могу продолжить после.

Другой вопрос, возможно ли обработать этот экспорт в PHP только с драйвером DataStax PHP?

1

Решение

СКОПИРОВАТЬ В … не очень хорошая идея использовать на большом количестве данных.

Можно ли обработать этот экспорт в 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']);
}
1

Другие решения

Короткий ответ — да, есть более быстрые способы сделать это.

Чем дольше ответ, если вы собираетесь сохранять эти строки в файл на регулярной основе — вы можете использовать Apache Spark. В зависимости от того, сколько памяти находится на ваших узлах Cassandra, вы можете выполнить простое сканирование таблицы строк на 500 миллионов => запись в файл до < 1 час.

1

Есть несколько вариантов, которые могут дать вам быстро & надежный оборот:

  1. улей [My Preferred One, запускайте SQL как Query]
  2. Shark / Beeline [запустить SQL как Query]
  3. искра [Быстро для вычислений, связанных с данными, но не лучший вариант для вашего варианта использования]

Для 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

0
По вопросам рекламы [email protected]