【问题标题】:Datastax Cassandra c# driver not inserting data through batchDatastax Cassandra c#驱动程序不通过批处理插入数据
【发布时间】:2015-08-08 03:32:42
【问题描述】:

我一直在尝试使用 datastax cassandra c# 驱动程序使用批处理将数据插入 cassandra 键空间。尝试批量插入 100 行。代码工作正常,但是当我检查列族时没有数据。如果有人知道,请提出为什么数据插入不起作用?如果有任何异常,为什么 catch 无法获取该异常? 通过cqlsh命令行插入数据没有问题。

private static void InsertData(ISession session, List<cf_Data> lsData)
    {
        try
        {
            var table = session.GetTable<cf_Data>();
            table.CreateIfNotExists();

            int count = 0;
            var batch  =session.CreateBatch();;
            foreach (cf_Data val in lsData)
            {
                try
                {
                    if (((count) % 100) == 1)
                    {
                       batch = session.CreateBatch();
                    }
                    batch.Append(table.Insert(val)); 
                    if (count % 100 == 0)
                    {
                        batch.Execute();   
                    }
                }
                catch (Exception)
                {
                    throw;
                }
                count++;
            }
        }
        catch (Exception)
        {
            throw;
        }
    }

为了将 C# 类映射到 Cassandra 列族,使用 Cassandra.Mapper 命名空间。 映射器类代码:

[AllowFiltering]
[Table("cf_Data ")]
internal class cf_Data 
{
    [PartitionKey]
    public Guid Id { get; set; }
    public DateTimeOffset Rundate { get; set; }
    public DateTimeOffset OtherDate{ get; set; }
    public String StudentFirstName { get; set; }
    public String StudentLastName { get; set; }
}

【问题讨论】:

  • 当您执行此代码时,您是否在cf_Data 表中获得了准确的1 条记录?通过在cqlsh 中运行select count(*) from cf_Data 来检查这一点。如何生成id:Guid Id
  • 如果您出于性能原因这样做,您可能会doing this wrong。一个接一个地插入记录通常会更快,因为插入可以直接命中集群中的多个节点。在批量插入的情况下,请求将命中单个协调节点,然后将写入重定向到其他节点。
  • 另一个关于性能的说明;但您不应该在生产系统上使用 ALLOW FILTERING。
  • @oleksii:没有得到任何行。

标签: c# cassandra


【解决方案1】:

如果你想执行一个包含一些查询的批处理,你应该调用一次Batch.Execute()

在你的情况下,它会是:

var batch = session.CreateBatch();
foreach (var val in lsData) 
{
    batch.Append(table.Insert(val)); 
}
batch.Execute();

也就是说,对于“批量”插入,使用 Batch 并不是最好的方法。单次插入会更快。

您应该阅读@oleksii 建议的帖子:https://lostechies.com/ryansvihla/2014/08/28/cassandra-batch-loading-without-the-batch-keyword/

您可以阅读DataStax C# driver documentation for the Linq component

【讨论】:

  • 批处理可能不是性能的理想选择,但它必须将数据插入列族。我怀疑一些数据验证问题,但仍然必须抛出一些异常。
  • 下面的链接建议使用准备好的语句进行批处理更快github.com/davidtinker/cassandra-perf
猜你喜欢
  • 2016-01-22
  • 2019-04-18
  • 2015-05-18
  • 2016-10-06
  • 2015-06-23
  • 1970-01-01
  • 2021-02-09
  • 2016-02-27
  • 2017-01-20
相关资源
最近更新 更多