2017-09-04 2 views
4

Ich habe eine Spalte in Cassandra, die aus einer Liste von Listen besteht, die bei Abfrage mit dem Python-Treiber eine OrderedMapSerializedKey-Struktur liefert. Diese Struktur ist eine Liste von Listen. Ich möchte die ganze Frage in Pandas stecken.Umwandlung eines Cassandra OrderedMapSerializedKey in ein Python-Wörterbuch

Um Daten aus dieser OrderedMapSerializedKey-Struktur zu extrahieren, dh um den Schlüssel zu erhalten und ihn als Beschriftung für eine neue Spalte zu verwenden und nur das erste Element der Liste als Wert zu behalten, verwende ich die Methode here mit einigen komplexen/schmutzige Manipulation in der Fabrik, bevor der eingebaute DataFrame zurückgegeben wird.

Ein ähnliches Problem wurde here gestellt, ohne wirklich eine Antwort.

Gibt es eine bessere Möglichkeit, eine solche OrderedMapSerializedKey-Struktur in ein Python-Wörterbuch zu verwandeln, das einfach in einen Pandas DataFrame geladen werden kann?

Antwort

2

Ich denke, eine ultimative Lösung könnte OrderedMapSerializedKey Cassandra Struktur als dict in Ihrer Dataframe-Spalte speichern, dann könnten Sie diesen Wert/Spalte an jeden übertragen, den Sie möchten. Ultimate, weil Sie die tatsächlichen Schlüssel in Cassandra-Zeilen möglicherweise nicht kennen (möglicherweise werden andere Schlüssel in Zeilen eingefügt).

So, hier die Lösung, die ich getestet habe, haben Sie nur die pandas_factory funciton zu verbessern:


EDIT:

In früheren Lösung, die ich nur die erste (0.) Reihe ersetzt Cassandra Datensatz (rows sind Liste von Tupeln in dem jedes Tupel eine Zeile in Cassandra ist)

from cassandra.util import OrderedMapSerializedKey 

def pandas_factory(colnames, rows): 

    # Convert tuple items of 'rows' into list (elements of tuples cannot be replaced) 
    rows = [list(i) for i in rows] 

    # Convert only 'OrderedMapSerializedKey' type list elements into dict 
    for idx_row, i_row in enumerate(rows): 

     for idx_value, i_value in enumerate(i_row): 

      if type(i_value) is OrderedMapSerializedKey: 

       rows[idx_row][idx_value] = dict(rows[idx_row][idx_value]) 

    return pd.DataFrame(rows, columns=colnames) 

Sie müssen eine automatische Überprüfung vornehmen, ob vor/nach dem Cassandra-Kartenfeld mindestens ein Wert vorhanden ist, oder das obige Skript manuell entsprechend ändern.

Schönen Tag!

+0

Dies ist auf dem gleichen Weg wie ich es tat. –

Verwandte Themen