【问题标题】:How to delete a range of rows from Cassandra using c#如何使用 c# 从 Cassandra 中删除一系列行
【发布时间】:2014-09-30 00:58:38
【问题描述】:

我正在尝试让这个程序运行。数据库已创建,其中有值。 BigInt 类型的列“ts”是主键。当我尝试执行时

session.Execute(deleteAll);

它抛出一个异常。从 c# 中删除键在 value1 和 value2 之间的所有行的正确方法是什么?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Cassandra;
using Cassandra.Data;

namespace CasandraGettingStarted
{
    class Program
    {
        static long ninetySeventyTicks = new DateTime(1970, 1, 1).Ticks;
        static string symbol = "SPX";

        static void Main(string[] args)
        {
            StartCassandra();
        }

        protected static long ToUnixTimestampMicro(DateTime dateTime)
        {
            return (dateTime.Ticks - ninetySeventyTicks) / 10;
        }

        static DateTime ConvertFromUnixTimestampMicro(double timestamp)
        {
            return new DateTime((long)timestamp * 10).AddYears(1969);//.ToLocalTime();
        }

        static void StartCassandra()
        {
            try
            {
                System.Random random = new Random(123456);

                Cluster cluster = Cluster.Builder().AddContactPoint("127.0.0.1").Build();
                ISession session = cluster.Connect("timeseries");

                double minPrice = 1100.00;
                double maxPrice = 1200.00;

                for (int i = 0; i < 10; i++)
                {
                    //long timestamp = (DateTime.Now.Ticks - new DateTime(1970, 1, 1).Ticks) / 10;
                    System.DateTime nowMicro = System.DateTime.Now;
                    long timestamp = ToUnixTimestampMicro(nowMicro);
                    System.DateTime nowMicro1 = ConvertFromUnixTimestampMicro(timestamp);

                    Console.WriteLine(nowMicro.ToString("HH:mm:ss.ffffff"));
                    Console.WriteLine(nowMicro1.ToString("HH:mm:ss.ffffff"));

                    double bidD = random.NextDouble();
                    bidD = bidD * (maxPrice - minPrice) + minPrice;
                    double askD = bidD + random.NextDouble();

                    decimal bid = (decimal)bidD;
                    decimal ask = (decimal)askD;

                    bid = decimal.Round(bid, 2);
                    ask = decimal.Round(ask, 2);

                    Console.WriteLine("Adding {0} {1} {2} {3}", timestamp, symbol, bid, ask);

                    var batchStmt = new BatchStatement();
                    var v2Insert = new SimpleStatement("insert into underlying_data " +
                        "(ts, symbol, bid, ask) values(?, ?, ?, ?);");
                    batchStmt.Add(v2Insert.Bind(timestamp, symbol, bid, ask));

                    session.Execute(batchStmt);
                    // Insert Data
                    //session.Execute("insert into underlying_data (ts, symbol, bid, ask) values (timestamp, 'SPX', bid, ask)");

                    //Thread.Sleep(1);
                }

                RowSet result = session.Execute("select * from underlying_data");

                foreach (Row row in result)
                    Console.WriteLine("{0} {1} {2} {3}", row["ts"], row["symbol"], row["bid"], row["ask"]);


                string deleteAll = @"select * from underlying_data where ts > ";
                deleteAll += ninetySeventyTicks.ToString();

                session.Execute(deleteAll);

                RowSet rows = session.Execute("select * from underlying_data");

                foreach (Row row in result)
                    Console.WriteLine("{0} {1} {2} {3}", row["ts"], row["symbol"], row["bid"], row["ask"]);
            }
            catch(Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }

            // Wait for enter key before exiting
            Console.ReadLine();
        }
    }
}

【问题讨论】:

    标签: c# cassandra


    【解决方案1】:
    session.Execute(deleteAll);
    

    首先,看起来deleteAll 被定义为SELECT 查询:

    string deleteAll = @"select * from underlying_data where ts > ";
        deleteAll += ninetySeventyTicks.ToString();
    

    所以这不会删除任何内容。事实上,Cassandra 只允许在主键 SELECT 上使用 =IN 运算符。尽管您没有明确提及,但我确定您看到的异常类似于:

    [Invalid query] message="分区键只支持EQ和IN关系(除非你使用token()函数)"

    如异常所示,您不能使用&gt;&lt;,除非您使用token() 函数封装这些值。但是token() 不会给你想要的,因为主键标记没有排序。

    同样,如果您尝试使用除 = 之外的任何其他内容来实际使用 DELETE,您会得到:

    [Invalid query] message="Invalid operator

    SELECT 不同,DELETE 不允许您在token() 函数中使用大于/小于运算符。使用= 运算符和主键删除的唯一替代方法是为DELETE 提供一个包含多个主键的IN 子句。

    您还应该注意,定期删除数据会产生大量墓碑,因此 Cassandra 通常不鼓励使用大量删除的使用模式。如需更多信息,请查看CQL DELETE command 上的文档。

    【讨论】:

    • 感谢您的详细回复。因此,我如何搜索所有行 > 和
    • @Ivan 没有看到你的模式很难说。但是您可能应该创建一个专门为此查询设计的附加表。该表应该指定其他东西作为其分区键,以便您可以通过它进行查询并将ts 用作集群键。发布您当前的表结构,我会提出建议。
    猜你喜欢
    • 2012-09-17
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    • 2017-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-27
    相关资源
    最近更新 更多