2016-02-05 20 views
9

Cassandra kümemizi bağlamak ve sorgulamak için Python cassandra sürücüsünü kullanıyorum. , https://datastax.github.io/python-driver/api/cassandra/protocol.htmlPandalar ve Cassandra: sayı dizisi uyumsuzluğu

NumpyProtocolHander: deserializes results directly into NumPy arrays. This facilitates efficient integration with analysis toolkits such as Pandas.

yukarıdaki talimatlara takip etmek ve Cassandra'ya bir SELECT sorgusu yapıyor:

Ben Pandalar aracılığıyla benim verileri işlemek istiyorum

, bu tam bahseder cassandra sürücü için belgelerinde bir alan vardır bir şekilde (tip() fonksiyonu ile) çıkışını görebilirsiniz:

: sonuçlar arasında

<class 'cassandra.cluster.ResultSet'> 

yineleme, bu nedir bir satır baskı olarak çıkageldi

{u'reversals_rejected': array([0, 0]), u'revenue': array([ 0, 10]), u'reversals_revenue': array([0, 0]), u'rejected': array([3, 1]), u'impressions_positive': array([3, 3]), u'site_user_id': array([226226, 354608], dtype=int32), u'error': array([0, 0]), u'impressions_negative': array([0, 0]), u'accepted': array([0, 2])} 

(Sorgu sonuçlarını sınırlandırdım, çok daha büyük miktarda veriyle çalışıyorum - bu nedenle numpy ve pandaları kullanmak istiyorum).

Pandalar bilgilerim, ben çok temel işlevleri çalıştırmak girişiminde sınırlıdır

:

rslt = cassandraSession.execute("SELECT accepted FROM table") 

test = rslt[["accepted"]].head(1) 

Bu, aşağıdaki hatayı verir: Ben hatasını anladıktan

Traceback (most recent call last): 
    File "/UserStats.py", line 27, in <module> 
    test = rslt[["accepted"]].head(1) 
    File "cassandra/cluster.py", line 3380, in cassandra.cluster.ResultSet.__getitem__ (cassandra/cluster.c:63998) 
TypeError: list indices must be integers, not list 

, sadece bilmiyorum Bu sözde numpy dizisinden Pandaları kullanabilmek için "geçiş".

cevap

7

Kısa cevap:

df = pd.DataFrame(rslt[0]) 
test = df.head(1) 

rslt [0] kolayca Pandalar dataframe dönüştürülebilir olduğunu, bir Python dict size verileri verir. Tam bir çözüm için

:

import pandas as pd 
from cassandra.cluster import Cluster 
from cassandra.protocol import NumpyProtocolHandler 
from cassandra.query import tuple_factory 

cluster = Cluster(
    contact_points=['your_ip'], 
    ) 
session = cluster.connect('your_keyspace') 
session.row_factory = tuple_factory 
session.client_protocol_handler = NumpyProtocolHandler 

prepared_stmt = session.prepare ("SELECT * FROM ... WHERE ...;") 
bound_stmt = prepared_stmt.bind([...]) 
rslt = session.execute(bound_stmt) 
df = pd.DataFrame(rslt[0]) 

Not: Sorgu büyükse yukarıdaki çözüm size sadece verilerin bir kısmını alacak. Yani yapmalısınız:

df = pd.DataFrame() 
for r in rslt: 
    df = df.append(r) 
+0

Yardımlarınız için teşekkürler! DataFrame için dizinin belirtilmesi sonunda eksik olduğum şeydi! – joao

+0

'.bind ([...]) köşeli parantezler içinde ne var? – yeliabsalohcin

+1

@yeliabsalohcin Sorguya göndermek istediğiniz değişkenler. Eğer hazırlamış olduğunuz ifadede böyle bir sorguya sahip olsaydınız: "SELECT * FROM kullanıcılarından WHERE user_id =? AND date =?" "?" yerini alacaklardı. – Tickon