2015-12-24 5 views
5

cqlsh не разрешает вложенные запросы, поэтому я не могу экспортировать выбранные данные в csv .. Я пытаюсь экспортировать выбранные данные (около 200 000 строк с одним столбцом) из cassandra, используя :Получить отдельные ключи разделов из таблицы C *

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

и он просто застрял навсегда без каких-либо ошибок, и файл не растет.

, если я использую Трассирование на последней строке я получил много строк, как:

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

Попробуйте strace, чтобы увидеть, где он застревает. cqlsh, вероятно, установит ограничение по вашему запросу по умолчанию, поэтому, возможно, это не лучший способ сделать это. – phact

+0

@phact см. Мое редактирование :) – Rada

+0

Возможно, попробуйте cqlsh --debug. Я не уверен, почему нет файловых дескрипторов в вашем strace select https://gist.github.com/tonyc/1384523 – phact

ответ

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> 

и нажмите клавишу ввода, пока он не закончил.

Еще быстрее вариант заключается в использовании 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, но это не так быстро, когда мне нужно создать запрос rdd на C * для отдельной колонки из очень (2B rows ~) и распечатать их в файл:

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

Обычно вы должны использовать команду cqlsh «COPY ... TO ...» для экспорта данных из таблицы в файл csv.

См. Документацию here.

Я не уверен, почему то, что вы пытаетесь застрять. Для отладки я бы предложил не использовать DISTINCT и добавить предложение LIMIT. Возможно, ваш стол большой, и поэтому cqlsh выводит подкачки результатов, но никто не может нажать «вернуться», чтобы перейти к следующей странице результатов, поэтому он ждет навсегда.

+0

Как я могу использовать 'copy to' без вложенных запросов? Я хочу получить отдельные ключи раздела таблицы, а не все из них, так что «COPY listener.snapshots (imei) TO« temp.csv »; недостаточно. – Rada

+0

Вы были правы в том, почему он получил stck- я пробовал с лимитом, и это сработало. Все еще не знает, как получить отдельные ключи разделов. – Rada

+0

Я бы использовал «sort -u», чтобы удалить дубликаты после создания файла csv. –

Смежные вопросы