Это мой запрос, если текущие данные ID присутствует или отсутствует в базе данных CassandraПочему моя вставка данных в мою базу данных cassandra так медленно?
row = session.execute("SELECT * FROM articles where id = %s", [id])
Устранены сообщения в Кафки, то определить, существует ли или нет это сообщение в базе данных Cassandra, если он не существует, то он должен выполнить операцию вставки, если она существует, ее не следует вставлять в данные.
messages = consumer.get_messages(count=25)
if len(messages) == 0:
print 'IDLE'
sleep(1)
continue
for message in messages:
try:
message = json.loads(message.message.value)
data = message['data']
if data:
for article in data:
source = article['source']
id = article['id']
title = article['title']
thumbnail = article['thumbnail']
#url = article['url']
text = article['text']
print article['created_at'],type(article['created_at'])
created_at = parse(article['created_at'])
last_crawled = article['last_crawled']
channel = article['channel']#userid
category = article['category']
#scheduled_for = created_at.replace(minute=created_at.minute + 5, second=0, microsecond=0)
scheduled_for=(datetime.utcnow() + timedelta(minutes=5)).replace(second=0, microsecond=0)
row = session.execute("SELECT * FROM articles where id = %s", [id])
if len(list(row))==0:
#id parse base62
ids = [id[0:2],id[2:9],id[9:16]]
idstr=''
for argv in ids:
num = int(argv)
idstr=idstr+encode(num)
url='http://weibo.com/%s/%s?type=comment' % (channel,idstr)
session.execute("INSERT INTO articles(source, id, title,thumbnail, url, text, created_at, last_crawled,channel,category) VALUES (%s,%s, %s, %s, %s, %s, %s, %s, %s, %s)", (source, id, title,thumbnail, url, text, created_at, scheduled_for,channel,category))
session.execute("INSERT INTO schedules(source,type,scheduled_for,id) VALUES (%s, %s, %s,%s) USING TTL 86400", (source,'article', scheduled_for, id))
log.info('%s %s %s %s %s %s %s %s %s %s' % (source, id, title,thumbnail, url, text, created_at, scheduled_for,channel,category))
except Exception, e:
log.exception(e)
#log.info('error %s %s' % (message['url'],body))
print e
continue
Edit:
У меня есть один идентификатор, который имеет только один уникальную строку таблицы, которые я хочу быть. Как только я добавляю разные расписания для уникального идентификатора, моя система выходит из строя. Добавьте это, если len (list (row)) == 0: это правильная мысль, но после этого моя система очень медленная.
Это мое описание таблицы:
DROP TABLE IF EXISTS schedules;
CREATE TABLE schedules (
source text,
type text,
scheduled_for timestamp,
id text,
PRIMARY KEY (source, type, scheduled_for, id)
);
Это scheduled_for изменчива. Вот также конкретный пример
Hao article 2016-01-12 02:09:00+0800 3930462206848285
Hao article 2016-01-12 03:09:00+0801 3930462206848285
Hao article 2016-01-12 04:09:00+0802 3930462206848285
Hao article 2016-01-12 05:09:00+0803 3930462206848285
Спасибо за ваши ответы!
Учитывая, что операции записи дешевы в то время как операции чтения не может быть, я думаю, что вид оптимизации вы пытаетесь сделать не имеет смысла. – Ralf
@ Ralf Хорошо, так что бы предложило вместо этого? Спасибо за ваш ответ! – peter
Просто вставьте запись еще раз? Или, по крайней мере, не выбирайте * из таблицы, а только идентификатор. Таким образом, вы сохраняете некоторую пропускную способность сети. (Я думаю, что Cassandra все еще загружает всю строку, может быть, кто-то может прокомментировать это.) В зависимости от вашего приложения выбор каждой строки перед вставкой имеет addtl. недостаток разбавления кэшей Cassandra, снижая производительность чтения для ваших пользователей. – Ralf