将大量数据从Cassandra导出到CSV

时间:2014-07-22 19:38:48

标签: csv cassandra bigdata cassandra-2.0

我使用Cassandra 2.0.9存储大量数据,让我们说100Gb,在一个列族中。我想快速将此数据导出为CSV。我试过了:

  • sstable2json - 它生成了很大的json文件,难以解析 - 因为工具将数据放在一行并使用复杂的模式(例如300Mb数据文件=〜2Gb json),它需要一个很多时间转储,Cassandra喜欢根据内部机制更改源文件名
  • COPY - 在相当快的EC2实例上导致大量记录超时
  • 捕获 - 如上所述,导致超时
  • 用分页读取 - 我使用了timeuuid,但它每秒返回大约1,5k条记录

我使用具有快速存储,15 Gb RAM和4核的Amazon Ec2实例

对于从Cassandra到CSV的数据导出千兆字节有没有更好的选择?

3 个答案:

答案 0 :(得分:4)

2020年更新:DataStax提供了一个称为DSBulk的特殊工具,用于从Cassandra(从Cassandra 2.1开始)和DSE(从DSE 4.7 / 4.8开始)加载和卸载数据。在最简单的情况下,命令行如下所示:

dsbulk unload -k keyspace -t table -url path_to_unload

DSBulk已针对加载/卸载操作进行了优化,并具有很多选项,包括从压缩文件导入/导出,提供自定义查询等。

有一系列有关DSBulk的博客文章,可以提供更多信息和示例:123456

答案 1 :(得分:3)

因为当你尝试从Cassandra导出一个包含数百万行的表时,使用COPY会非常具有挑战性,所以我所做的就是创建一个简单的工具来从cassandra表中获取chunk(paginated)的数据块并导出它是CSV。

使用datastax中的java库查看我的example solution

答案 2 :(得分:1)

受@ user1859675答案的启发,这是我们如何使用Spark从Cassandra导出数据

val cassandraHostNode = "10.xxx.xxx.x5,10.xxx.xxx.x6,10.xxx.xxx.x7";
val spark = org.apache.spark.sql.SparkSession
                                    .builder
                                    .config("spark.cassandra.connection.host",  cassandraHostNode)
                                    .appName("Awesome Spark App")
                                    .master("local[*]")
                                    .getOrCreate()

val dataSet = spark.read.format("org.apache.spark.sql.cassandra")
                        .options(Map("table" -> "xxxxxxx", "keyspace" -> "xxxxxxx"))
                        .load()

val targetfilepath = "/opt/report_values/"
dataSet.write.format("csv").save(targetfilepath)  // Spark 2.x

您需要在类路径中使用“ spark-cassandra-connector”才能使其正常工作。
我使用的版本低于

    <groupId>com.datastax.spark</groupId>
    <artifactId>spark-cassandra-connector_2.11</artifactId>
    <version>2.3.2</version>