我想将我的网站图像存储在cassandra数据库中!我必须读取并存储图像的字节.你有一个很好的代码吗?我正在使用python2.7,django框架和cql-engine!
这是我的代码:
1-我的模特:
from cqlengine import columns
from cqlengine.models import Model
class UserImage(Model):
Email = columns.Text(primary_key=True)
image=columns.Bytes(required=False)
Run Code Online (Sandbox Code Playgroud)
2-我的表格:
class UserImage(forms.Form):
image=forms.ImageField()
Run Code Online (Sandbox Code Playgroud)
3-我的观点:
from MainAPP.models import UserImage as UserImageModel
from MainAPP.forms import UsersForms
from django.http import HttpResponse
from cqlengine import connection
from PIL import Image
def UploadImage(request):
if request.method == 'POST':
form = UsersForms.UserImage(request.POST, request.FILES)
if form.is_valid():
try:
image_data=Image.open(request.FILES['image'])
except IOError:
return HttpResponse("cannot upload %s"% request.FILES['image'].name)
connection.setup(['127.0.0.1:9160'])
UserImageModel.create(Email='ebrahimi.omid69@gmail.com', image=image_data)
return HttpResponse('Stored Successfully!')
else:
form= UsersForms.UserImage()
return render_to_response('Users/uploadImage.html', {'form': form}, context_instance=RequestContext(request))
Run Code Online (Sandbox Code Playgroud)
我的模板: …
我在cassandra中呈现复杂的数据结构时遇到问题. JSON数据示例:
{
"A": {
"A_ID" : "1111"
"field1": "value1",
"field2": "value2",
"field3": [
{
"id": "id1",
"name": "name1",
"segment": [
{
"segment_id": "segment_id_1",
"segment_name": "segment_name_1",
"segment_value": "segment_value_1"
},
{
"segment_id": "segment_id_2",
"segment_name": "segment_name_2",
"segment_value": "segment_value_2"
},
...
]
},
{
"id": "id2",
"name": "name2",
"segment": [
{
"segment_id": "segment_id_3",
"segment_name": "segment_name_3",
"segment_value": "segment_value_3"
},
{
"segment_id": "segment_id_4",
"segment_name": "segment_name_4",
"segment_value": "segment_value_4"
},
...
]
},
...
]
}
}
Run Code Online (Sandbox Code Playgroud)
将仅使用一个查询: 按A_ID查找.
我认为这些数据应该存储在一个TABLE(列族)中,而不需要序列化/反序列化操作,以提高效率.如果CQL不支持嵌套地图和列表,我该怎么做?
我的用例
我想通过时间戳DESC订购结果.但我不希望时间戳成为主键中的第二列,因为这将取决于我的查询功能
例如
create table demo(oid int,cid int,ts timeuuid,PRIMARY KEY (oid,cid,ts)) WITH CLUSTERING ORDER BY (ts DESC);
Run Code Online (Sandbox Code Playgroud)
需要查询:
I want the result for all the below queries to be in DESC order of timestamp
select * from demo where oid = 100;
select * from demo where oid = 100 and cid = 10;
select * from demo where oid = 100 and cid = 100 and ts > minTimeuuid('something');
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用CLUSTERING ORDER IN CQL创建此表并获取此错误
cqlsh:v> create table demo(oid int,cid int,ts …Run Code Online (Sandbox Code Playgroud) 我正在尝试从具有双类型列的Cassandra表中获取Double值.我用CQL3语法创建了表:
CREATE TABLE data_double (
datetime timestamp,
value double,
primary key (datetime)
);
Run Code Online (Sandbox Code Playgroud)
我插了一行:
INSERT INTO data_double (datetime, value) VALUES ('111111111', 123.456);
Run Code Online (Sandbox Code Playgroud)
当我做:
SELECT * from data_double;
Run Code Online (Sandbox Code Playgroud)
我知道这个值是123.46
为什么价值四舍五入?
谢谢
假设一个简单的表有一个插入(或没有这个插入,并不重要).
CREATE TABLE test (
x int,
y int,
z int,
PRIMARY KEY (x, y, z)
);
create index z_index on test (z);
insert into test(x, y, z) values (1,2,3);
Run Code Online (Sandbox Code Playgroud)
我很难理解为什么我不能在索引z上使用in子句进行查询:
cqlsh:test> select*from test其中z in(3);
错误请求:PRIMARY KEY部分z不能被限制(前面部分y不受限制或非EQ关系)
可以使用简单的equals谓词:
cqlsh:test> select * from test where z = 3;
x | y | z
---+---+---
1 | 2 | 3
(0 rows)
Run Code Online (Sandbox Code Playgroud)
我认为在z上有一个索引会保留从z的特定值到行的映射,但这个假设似乎是错误的.
为什么这不符合我的预期?我猜索引的工作方式不同.
编辑:我正在使用[cqlsh 4.1.1 | Cassandra 2.0.6 | CQL规范3.1.1 | 节俭协议19.39.0]
我一直在阅读Cassandra文档的这一部分,发现以下有点令人费解:
确定列开销:
regular_total_column_size = column_name_size + column_value_size + 15
counter - expiring_total_column_size = column_name_size + column_value_size + 23
Cassandra中的每一列都会产生15个字节的开销.由于表中的每一行都可以具有不同的列名以及不同的列数,因此会为每列存储元数据.对于计数器列和到期列,您应该再添加8个字节(总共23个字节).
我为CQL3定义的模式解释上述方法,例如:
CREATE TABLE mykeyspace.mytable(
id text,
report_id text,
subset_id text,
report_date timestamp,
start_date timestamp,
end_date timestamp,
subset_descr text,
x int,
y double,
z int,
PRIMARY KEY (id, report_id, subset_id)
);
Run Code Online (Sandbox Code Playgroud)
是每一行将包含列名,如琴弦的元数据report_date,start_date,end_date,等及其类型与数据一起.但是,我不清楚表中的每一行可以有不同的列名是什么意思.这听起来不对我,因为上面的架构是完全静态的,即如果我尝试编写,Cassandra 2.0肯定会抱怨:
INSERT INTO mykeyspace.mytable (id, report_id , subset_id, x, y, z, w)
VALUES ( 'asd','qwe','rty',100,1.234,12, 123.123);
Bad Request: Unknown identifier …Run Code Online (Sandbox Code Playgroud) 我已cassandra 2.0成功安装.当我尝试开始时,cql 3我没有这样的选择:
cassandra -v
2.0.9
./cqlsh -3
Usage: cqlsh [options] [host [port]]
cqlsh: error: no such option: -3
Run Code Online (Sandbox Code Playgroud) 我是Cassandra的新人.我无法理解在表中使用计数器的优点是什么(如果非计数器列不是复合PRIMARY KEY的一部分,甚至在不同的表中也是如此)?为什么我们不使用具有Int类型的列,当我将有一些语句,如x = x ++; 使用int或counter之间有什么不同?
是否可以在Cassandra中使用Int Type的增量或减量?
如果在CQL shell中使用此代码,我将获得该键空间中所有表的名称.
DESCRIBE TABLES;
Run Code Online (Sandbox Code Playgroud)
我想使用ResulSet检索相同的数据.下面是我在Java中的代码.
String query = "DESCRIBE TABLES;";
ResultSet rs = session.execute(query);
for(Row row : rs) {
System.out.println(row);
}
Run Code Online (Sandbox Code Playgroud)
会话和群集早先已初始化为:
Cluster cluster = Cluster.builder().addContactPoint("127.0.0.1").build();
Session session = cluster.connect("keyspace_name");
Run Code Online (Sandbox Code Playgroud)
或者我想知道Java代码来检索密钥空间中的表名.
我是NoSQL的新手。因此,我试图了解一些Cassandra概念,这些概念我从我研究的数十种资料中无法真正得到。