cqlsh不允许嵌套查询,因此我无法将所选数据导出到csv .. 我正在尝试使用以下命令从cassandra导出所选数据(单列大约200,000行):
echo "SELECT distinct imei FROM listener.snapshots;" > select.cql
bin/cqlsh -f select.cql > output.txt
它只是永远没有任何错误,并且文件没有增长。
如果我在最后一行使用strace,我会得到很多行:
select(0, NULL, NULL, NULL, {0, 2000}) = 0 (Timeout)
select(0, NULL, NULL, NULL, {0, 4000}) = 0 (Timeout)
select(0, NULL, NULL, NULL, {0, 8000}) = 0 (Timeout)
select(0, NULL, NULL, NULL, {0, 16000}) = 0 (Timeout)
select(0, NULL, NULL, NULL, {0, 32000}) = 0 (Timeout)
select(0, NULL, NULL, NULL, {0, 1000}) = 0 (Timeout)
select(0, NULL, NULL, NULL, {0, 2000}) = 0 (Timeout)
select(0, NULL, NULL, NULL, {0, 4000}) = 0 (Timeout)
select(0, NULL, NULL, NULL, {0, 8000}) = 0 (Timeout)
select(0, NULL, NULL, NULL, {0, 16000}) = 0 (Timeout)
select(0, NULL, NULL, NULL, {0, 32000}) = 0 (Timeout)
select(0, NULL, NULL, NULL, {0, 1000}) = 0 (Timeout)
select(0, NULL, NULL, NULL, {0, 2000}) = 0 (Timeout)
select(0, NULL, NULL, NULL, {0, 4000}) = 0 (Timeout)
select(0, NULL, NULL, NULL, {0, 8000}) = 0 (Timeout)
和--debug只给我:
cqlsh --debug -f select.cql > output.txt
Using CQL driver: <module 'cassandra' from '/usr/share/dse/resources/cassandra/bin/../lib/cassandra-driver-internal-only-2.5.1.zip/cassandra-driver-2.5.1/cassandra/__init__.py'>
有什么不对? 是否有更好的方法从大型C *表中获取不同的分区键?
答案 0 :(得分:5)
我使用capture:
cqlsh> CAPTURE 'temp.csv'
Now capturing query output to 'temp.csv'.
cqlsh> SELECT distinct imei FROM listener.snapshots;
---MORE---
---MORE---
---MORE---
---MORE---
.
.
.
cqlsh>
cqlsh>
然后按Enter直到完成。
更快的选择是使用paging:
cqlsh> PAGING off
Disabled Query paging.
cqlsh> CAPTURE 'temp.csv'
Now capturing query output to 'temp.csv'.
cqlsh> SELECT distinct imei FROM listener.snapshots;
它会立即将数据提取到文件中(如果你得到一个OperationTimedOut,你应该编辑cassandra.yaml中的超时设置)。
我不能相信这是快速的方式......我知道我可以使用CassandraSQLContext使用spark导出数据但是当我需要为不同的列创建rdd查询C *时它不会那么快超出非常大的表(2B行〜),并将它们打印到文件:
val conf = new SparkConf().setAppName("ExtractDistinctImeis")
val sc = new SparkContext(conf)
val sqlContext = new SQLContext(sc)
val connector = CassandraConnector(conf)
val cc = new CassandraSQLContext(sc)
val snapshots_imeis = cc.sql("select distinct imei from listener.snapshots").map(row => row(0).toString)
val imeis = snapshots_imeis.collect
def printToFile(f: java.io.File)(op: java.io.PrintWriter => Unit) {
val p = new java.io.PrintWriter(f)
try { op(p) } finally { p.close() }
}
printToFile(new File("/path/to/file.txt")) { p => imeis.foreach(p.println) }
用火花花了3.5个小时!通过捕获,我设法在3分钟/ 3秒后获取我的文件。
答案 1 :(得分:1)
通常你会使用cqlsh“COPY ... TO ...”命令将数据从表导出到csv文件。
请参阅文档here。
我不确定你为什么要尝试被卡住。要调试我建议不要使用DISTINCT并添加LIMIT子句。它可能是你的表很大,所以cqlsh正在分页结果,但没有人按返回到结果的下一页,所以它会永远等待。