2015-12-24 14 views
5

cqlsh không cho phép truy vấn lồng nhau vì vậy tôi không thể xuất dữ liệu đã chọn sang csv .. Tôi đang cố gắng xuất dữ liệu đã chọn (khoảng 200.000 hàng với một cột đơn) từ cassandra :Nhận các khóa phân vùng riêng biệt từ bảng C *

echo "SELECT distinct imei FROM listener.snapshots;" > select.cql bin/cqlsh -f select.cql > output.txt

và nó chỉ bị mắc kẹt vĩnh viễn mà không cần bất kỳ lỗi, và các tập tin không phát triển.

nếu tôi sử dụng strace trên dòng cuối cùng tôi nhận được nhiều hàng như:

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) 

và --debug chỉ cho tôi:

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'> 

gì là sai? Có cách nào tốt hơn để nhận các khóa phân vùng riêng biệt từ bảng C * lớn không?

+0

Hãy thử strace để xem nó bị kẹt ở đâu. cqlsh có lẽ sẽ đặt giới hạn truy vấn của bạn theo mặc định để nó có thể không phải là cách tốt nhất để làm điều này. – phact

+0

@phact vui lòng xem chỉnh sửa của tôi :) – Rada

+0

Có thể thử cqlsh --debug. Tôi không chắc tại sao không có bộ mô tả tệp trong strace của bạn chọn https://gist.github.com/tonyc/1384523 – phact

Trả lời

5

tôi đã sử dụng 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> 

Và nhấn Enter cho đến khi nó kết thúc.

tùy chọn Thậm chí nhanh hơn là sử dụng 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; 

Nó sẽ ngay lập tức trích xuất dữ liệu đến tập tin (nếu bạn nhận được một OperationTimedOut bạn nên chỉnh sửa cài đặt thời gian chờ trong cassandra.yaml).

Tôi không thể tin rằng đó là cách nhanh nhất có ... Tôi biết tôi có thể xuất dữ liệu bằng cách sử dụng tia lửa bằng cách sử dụng CassandraSQLContext nhưng không quá nhanh khi tôi cần tạo truy vấn rdd C * cho cột riêng biệt bảng lớn (2B hàng ~) và in chúng vào tệp:

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) } 

Mất 3,5 giờ với tia lửa! Với chụp tôi quản lý để có được tập tin của tôi sau 3 phút/3 giây.

1

Thông thường bạn sẽ sử dụng lệnh "COPY ... TO ..." cqlsh để xuất dữ liệu từ bảng sang tệp csv.

Xem tài liệu here.

Tôi không chắc tại sao những gì bạn đang cố gắng gặp khó khăn. Để gỡ lỗi, tôi khuyên bạn không nên sử dụng DISTINCT và thêm mệnh đề LIMIT. Nó có thể là bảng của bạn là lớn và do đó cqlsh phân trang kết quả, nhưng không có ai ở đó để báo chí trở lại để đến trang tiếp theo của kết quả, vì vậy nó chờ đợi mãi mãi.

+0

Tôi làm cách nào để sử dụng 'sao chép' mà không có truy vấn lồng nhau? Tôi muốn nhận được các khóa phân vùng riêng biệt của bảng, không phải tất cả chúng, vì vậy- "COPY listener.snapshots (imei) TO 'temp.csv';" là không đủ. – Rada

+0

bạn đã đúng về lý do tại sao nó đã stck-tôi đã cố gắng với giới hạn và nó đã làm việc. Vẫn không biết cách nhận các khóa phân vùng riêng biệt. – Rada

+0

Tôi muốn sử dụng "sắp xếp -u" để xóa các bản sao sau khi bạn đã tạo tệp csv. –

Các vấn đề liên quan