2015-12-24 18 views
5

cqlsh, iç içe geçmiş sorgulara izin vermez, böylece seçili verileri csv'ye veremiyorum .. Seçili verileri (tek bir sütunla yaklaşık 200.000 satır) cassandra'dan dışa aktarmaya çalışıyorum :C * tablosundan ayrı bölüm anahtarları alın

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

ve sadece herhangi bir hata olmadan sonsuza sıkışmış ve dosya büyümüyor.

ben gibi birçok satır var son satırında strace kullanırsanız:

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) 

ve sadece bana vermek --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'> 

neyi Hata? Büyük C * tablosundan farklı bölüm anahtarları almanın daha iyi bir yolu var mı?

+0

Nerede takıldığını görmek için strace deneyin. cqlsh, varsayılan olarak, sorgunuza bir sınır koyacaktır, bu yüzden bunu yapmanın en iyi yolu olmayabilir. – phact

+0

@phact lütfen benim düzenle :) – Rada

+0

Belki de cqlsh --debug deneyin. Strace'ınızda neden dosya tanıtıcıları olmadığından emin değilim. Https://gist.github.com/tonyc/1384523 – phact

cevap

5

Ben capture kullandı:

cqlsh> CAPTURE 'temp.csv'            
Now capturing query output to 'temp.csv'. 
cqlsh> SELECT distinct imei FROM listener.snapshots; 
---MORE--- 
---MORE--- 
---MORE--- 
---MORE--- 
. 
. 
. 
cqlsh> 
cqlsh> 

Ve basın o bitene kadar girin.

Hatta daha hızlı seçenek paging kullanmaktır: (Bir OperationTimedOut sen cassandra.yaml zaman aşımı ayarlarını düzenlemek gerektiğini alırsanız)

cqlsh> PAGING off 
Disabled Query paging. 
cqlsh> CAPTURE 'temp.csv'            
Now capturing query output to 'temp.csv'. 
cqlsh> SELECT distinct imei FROM listener.snapshots; 

Hemen dosyaya veri ayıklamak olacaktır.

Oradaki hızlı yol olduğuna inanamıyorum ... CassandraSQLContext kullanarak kıvılcımı kullanarak veri ihraç edebileceğimi biliyorum ama çok hızlı bir şekilde farklı sütunlar için rx sorgulama C * oluşturmam gerektiğinde çok hızlı değil büyük tablo (2B satırlar ~), ve bunları dosyaya yazdırın:

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

Kıvılcım ile 3.5 saat sürdü! Yakalama ile 3 dk/3 sn sonra dosyamı almayı başarabilirim.

1

Genellikle, cqlsh "COPY ... TO ..." komutunu kullanarak bir tablodaki verileri csv dosyasına dışa aktarırsınız.

here belgelerine bakın.

Denemeye çalıştığınız şeyin neden sıkıştığından emin değilim. Hata ayıklamak için DISTINCT kullanıp LIMIT yan tümcesi eklememeyi öneririm. Masanız büyük olabilir ve bu yüzden cqlsh sonuçları çağırıyor, ancak sonuçların bir sonraki sayfasına geçmek için geri dönüşü yapacak kimse yok, bu yüzden sonsuza kadar bekler.

+0

'Kopyala'yı iç içe geçmiş sorgular olmadan nasıl kullanabilirim? Tablonun ayrı bölüm tuşlarını almak istiyorum, hepsi değil, yani- "COPY listener.snapshots (imei) TO 'temp.csv';" yeterli değil – Rada

+0

niçin bu işe yaradığı konusunda haklıydın - limitle denedim ve işe yaradı. Hala ayrı bölüm anahtarlarını nasıl alacağını bilmiyor. – Rada

+0

Csv dosyasını oluşturduktan sonra çiftleri kaldırmak için "sort -u" kullanırdım. –