2017-09-04 3 views
4

J'ai une colonne dans Cassandra composée d'une carte de listes qui, lorsqu'elle est interrogée avec le pilote Python, renvoie une structure OrderedMapSerializedKey. Cette structure est une carte de listes. Je voudrais mettre toute la question dans les pandas.Transformer une clé OrderedMapSerialized de Cassandra en un dictionnaire Python

Pour extraire des données de cette structure OrderedMapSerializedKey, ce qui signifie obtenir la clé et l'utiliser comme étiquette pour une nouvelle colonne et ne conserver que le premier élément de la liste comme valeur j'utilise l'approche here manipulation sale dans l'usine avant de retourner le DataFrame construit.

Un problème similaire a été demandé here, sans vraiment de réponse.

Existe-t-il un meilleur moyen de transformer une telle structure OrderedMapSerializedKey en un dictionnaire Python qui peut être facilement chargé dans un DataFrame pandas?

Répondre

2

Je pense qu'une solution ultime pourrait être de stocker OrderedMapSerializedKey structure Cassandra comme dict dans votre colonne de données, puis vous pouvez transférer cette valeur/colonne à quelqu'un que vous voulez. Ultime parce que vous ne pouvez pas connaître les clés réelles dans les rangées Cassandra (peut-être différentes clés sont insérées dans les rangées).

Voici donc la solution que je l'ai testé, il suffit d'améliorer la pandas_factory funciton:


EDIT:

En solution précédente, j'ai remplacé que le premier (0e) rangée de Cassandra ensemble de données (rows sont liste de tuples où chaque tuple est une ligne de Cassandra)

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) 

Vous devez insérer une vérification automatique s'il y a une valeur minimum avant/après le champ de la carte Cassandra ou modifier manuellement le script ci-dessus en conséquence.

Belle journée!

+0

Ceci est sur le même chemin de ce que j'ai fait. –