2017-09-04 175 views
4

在Cassandra中有一列包含列表映射,当它与Python驱动程序一起查询时,它将返回一个OrderedMapSerializedKey结构。这个结构是一个列表图。我想把整个查询放入熊猫。将Cassandra OrderedMapSerializedKey转换为Python字典

要从OrderedMapSerializedKey结构中提取数据,这意味着拿到钥匙,并用它作为标签的新列,当我使用的方法值保持名单的唯一的第一个元素与一些复杂提到here /在返回构建的DataFrame之前,在工厂中进行脏操作。

类似的问题被要求here,没有真正的答案。

有没有更好的方法将这样一个OrderedMapSerializedKey结构变成一个Python字典,可以很容易地加载到一个熊猫DataFrame?

回答

2

我认为最终的解决方案可能是将OrderedMapSerializedKey Cassandra结构作为dict存储在您的数据框列中,然后您可以将此值/列转移给您想要的任何人。最终,因为你可能不知道Cassandra行中的实际键(也许不同的键被插入到行中)。

所以在这里我测试过的解决方案,你只需要提高pandas_factory功能可按:


编辑:

在以前的解决方案,我更换的只有第一个(0)级行卡桑德拉数据集(rows是元组的列表,每个元组是在卡桑德拉行)

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) 

您必须插入一些自动检查Cassandra映射字段之前/之后是否有最小值的一个值,或者相​​应地手动修改上面的脚本。

美好的一天!

+0

这与我所做的相同。 –