Cassandra

Cassandra - 保存文件

  • May 3, 2016

我是 Cassandra 的新手,甚至更多 - 對於 MariaDB 或 Oracle 等習慣性 RDMS 系統,我從來沒有這樣的任務。

那麼,如何將文件儲存到 Cassandra 的表中呢?最好使用 Python 驅動程序,但也很少使用原始 CQL(cqlengine?)的範例。

我們有大量小於 10MB 的小文件,目前儲存在 Cassandra 中,我想了解它是如何完成的。

例如 - 使用下一個表:

cqlsh:testkeyspace> desc table files_uuids;

CREATE TABLE files_uuids (
 id uuid,
 file blob,
 PRIMARY KEY ((id))
) WITH
 bloom_filter_fp_chance=0.010000 AND
 caching='KEYS_ONLY' AND
 comment='' AND
 dclocal_read_repair_chance=0.100000 AND
 gc_grace_seconds=864000 AND
 index_interval=128 AND
 read_repair_chance=0.000000 AND
 replicate_on_write='true' AND
 populate_io_cache_on_flush='false' AND
 default_time_to_live=0 AND
 speculative_retry='99.0PERCENTILE' AND
 memtable_flush_period_in_ms=0 AND
 compaction={'class': 'SizeTieredCompactionStrategy'} AND
 compression={'sstable_compression': 'LZ4Compressor'};

您(和其他未來的讀者)也可以嘗試COPY使用cqlsh.

例如,如果您有一個名為“filedata.csv”的本地文件,其中包含例如

123-45-678-9,some file data here
abc-de-fgh-1,some other file data here

其中 CSV 欄位對應於表中的列file_uuids,那麼您應該能夠使用:

cqlsh> COPY file_uuids FROM 'filedata.csv';

希望這可以幫助!

接下來是我的實施。

創建用於數據的表:

cqlsh:testkeyspace> CREATE TABLE files_uuids (id uuid, file blob, PRIMARY KEY ((id)));

hello接下來 - 一些使用 Python Cassandra 驅動程序上傳文件的 Python 程式碼:

>>> from cassandra.cluster import Cluster
>>> cluster = Cluster()
>>> session = cluster.connect('testkeyspace')
>>> import os, uuid
>>> file = os.path.join(os.getcwd(), 'hello')
>>> fid = uuid.uuid4()
>>> with open(file, 'rb') as f:
...   data = f.read()
...   res = bytearray(data)
...   session.execute("INSERT INTO files_uuids (id, file) VALUES (%s, %s)", (fid, res))
...
>>>

檢查:

cqlsh:testkeyspace> select id from files_uuids;

id
--------------------------------------
83dc3905-437c-4bd7-896f-d092827f01dd

file以及來自該領域的確切數據:

cqlsh:testkeyspace> select file from files_uuids where id=83dc3905-437c-4bd7-896f-d092827f01dd;
...
e35005f6564617461005f66696e69005f5f6c6962635f73746172745f6d61696e4040474c4942435f322e322e35005f5f646174615f7374617274005f5f676d6f6e5f73746172745f5f005f5f64736f5f68616e646c65005f494f5f737464696e5f75736564005f5f6c6962635f6373755f696e6974005f656e64005f7374617274005f5f6273735f7374617274006d61696e005f4a765f5265676973746572436c6173736573005f5f544d435f454e445f5f005f49544d5f7265676973746572544d436c6f6e655461626c65005f696e697400

(1 rows)

引用自:https://dba.stackexchange.com/questions/102410