【问题标题】:Export complete table to csv from cassandra从 cassandra 将完整表导出到 csv
【发布时间】:2015-12-19 02:38:31
【问题描述】:

我在 cassandra 中有一个非常大的表(约 5 亿),我想将某些列的所有行导出到文件中。我使用 COPY 命令尝试了这个:

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

但完成导出需要大约 12 小时。有什么选择可以更快地完成吗?

如果仅导出某些列有问题,则导出所有数据也不会有问题。重要的是我需要一种方法来获取之后可以继续的所有条目。

另一个问题是,是否可以仅使用 DataStax PHP 驱动程序在 PHP 中处理此导出?

【问题讨论】:

  • PHP 是您可以使用的唯一解决方案吗? Play server (playframework) 怎么样 - 你可以使用 datastax Java 驱动程序,从 cassandra 读取数据,然后将它们打印到 HTML 输出。
  • 试试 Brian hess 的 cassandra-unloader

标签: php database cassandra cql datastax


【解决方案1】:

复制...到...not a good idea to use on a big amount of data

是否可以仅使用 DataStax PHP 驱动程序在 PHP 中处理此导出

我在 Datastax Java 驱动程序的帮助下从 Cassandra 导出了 CSV,但 PHP 必须具有相同的算法。根据documentation,您可以轻松地发出请求并打印输出。也请注意pagination

您可以在fputcsv 函数的帮助下将数组转换为 CSV

所以,最简单的例子是:

<?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']);
}  

【讨论】:

  • 您能否用“结果和行实现 Iterator、Countable 和 ArrayAccess”这一评论再解释一下您的意思?
  • 逐行和列数据迭代的选择查询的结果以数组的形式呈现。请阅读关于 pangination - "datastax.github.io/php-driver/features/result_paging" 我认为你需要在你的解决方案中使用它,因为你有很多数据并且。
  • 感谢分页提示,这对我帮助很大。这样我比 COPY 更快,我可以直接过滤结果而不将其写入文件。
【解决方案2】:

简短的回答是肯定的,有更快的方法来做到这一点。

如果您要定期将这些行保存到文件中,“如何”是一个更长的答案 - 您可能想要使用Apache Spark。根据 Cassandra 节点上的内存量,您可以将简单的 5 亿行表扫描 => 写入文件缩短到

【讨论】:

  • 感谢您的想法,听起来这可能是我的解决方案。问题是我只有一台服务器运行这个系统(32GB RAM)。是否可以仅在一台服务器上运行 cassandra 和 sparks?
  • 是的,没关系,按照安装说明再次发布您的表格详细信息 + 带有 apache-spark 标签的输出要求,我将帮助您启动和运行。
【解决方案3】:

有一些选项可以为您提供快速可靠的周转:

  1. Hive [我的首选,像查询一样运行 SQL]
  2. Shark/Beeline [像查询一样运行 SQL ]​​i>
  3. Spark [快速进行数据相关计算,但不是您的用例的最佳选择]

对于 PHP[Hive PHP 客户端]:

<?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();

参考:https://cwiki.apache.org/confluence/display/Hive/HiveClient#HiveClient-PHP

【讨论】:

    猜你喜欢
    • 2015-09-01
    • 2014-09-13
    • 1970-01-01
    • 2015-07-11
    • 2018-04-15
    • 2020-10-09
    • 2015-01-10
    • 2017-02-12
    • 2020-09-11
    相关资源
    最近更新 更多