在 C# 中将数据导入 Cassandra Cluster 的最佳方法
Best way to import data into Cassandra Cluster in c#
我在 sql 服务器中有数十亿行数据。我们现在改用 Cassandra 作为数据仓库来执行分析工作。 SQL 服务器将作为 OLTP 和 Cassandra 作为 OLAP。通过 datastax c# 驱动程序将数据导入到 cassandra 中。我一直在尝试通过 datastax c# 驱动程序插入 cassandra 的各种方法。插入大量数据的最佳方式是什么?
我创建了各种 PCO(普通 cassandra 对象),它们是 Cassandra Column 系列的映射器。列族有 30 多个列。
[Table("CF_Data")]
internal class CF_Data
{
[PartitionKey]
public Guid Date{ get; set; }
public DateTimeOffset Name { get; set; }
.................
}
第一种方法:
我正在创建上述 class 的实例并将其绑定到批处理语句。最后执行每 1000 行的批处理。
var batch =session.CreateBatch();;
foreach (cf_Data val in lsData)
{
try
{
if (((count) % 1000) == 1)
{
batch = session.CreateBatch();
}
batch.Append(table.Insert(val));
if (count % 1000 == 0)
{
batch.Execute();
}
}
catch (Exception)
{
throw;
}
count++;
}
第二种方法:
通过 Mapper 每行插入数据。
try
{
IMapper mapper = new Mapper(session);
foreach (CF_Data val in listData)
{
try
{
mapper.Insert(val);
}
catch (Exception)
{
//throw;
}
}
}
catch (Exception)
{
throw;
}
我还通过绑定 CF_Data 实例的每个属性通过 PreparedStatement 和 BatchStatement 插入数据,但是我如何将 CF_Data 的实例(这是要插入的一行)绑定到 PreparedStatement。
PreparedStatement ps = session.Prepare(@"INSERT INTO CF_Data
(
Date,
Name, ....
) " +
"VALUES (now(),?, ?, ?, ?,?,?,?,?,?,?,?,?,?,?,?,?)");
最好的网络拓扑结构(replication_factor、snitch 等)是什么,可以通过足够的数据副本获得最佳性能以避免单点故障?现在我使用的是 simplestrategy & replication_factor of 3。如何像 Cassandra 团队所说的那样快速阅读?
最好不要使用Insert(***)进行海量数据迁移,cassandra提供"Copy ** from **"从csv导入数据,超过6M数据记录可能会超时,越多越好方法是@jorgebg说的是sstableloader加载海量数据肯定能满足你的需求
我在 sql 服务器中有数十亿行数据。我们现在改用 Cassandra 作为数据仓库来执行分析工作。 SQL 服务器将作为 OLTP 和 Cassandra 作为 OLAP。通过 datastax c# 驱动程序将数据导入到 cassandra 中。我一直在尝试通过 datastax c# 驱动程序插入 cassandra 的各种方法。插入大量数据的最佳方式是什么?
我创建了各种 PCO(普通 cassandra 对象),它们是 Cassandra Column 系列的映射器。列族有 30 多个列。
[Table("CF_Data")]
internal class CF_Data
{
[PartitionKey]
public Guid Date{ get; set; }
public DateTimeOffset Name { get; set; }
.................
}
第一种方法: 我正在创建上述 class 的实例并将其绑定到批处理语句。最后执行每 1000 行的批处理。
var batch =session.CreateBatch();;
foreach (cf_Data val in lsData)
{
try
{
if (((count) % 1000) == 1)
{
batch = session.CreateBatch();
}
batch.Append(table.Insert(val));
if (count % 1000 == 0)
{
batch.Execute();
}
}
catch (Exception)
{
throw;
}
count++;
}
第二种方法: 通过 Mapper 每行插入数据。
try
{
IMapper mapper = new Mapper(session);
foreach (CF_Data val in listData)
{
try
{
mapper.Insert(val);
}
catch (Exception)
{
//throw;
}
}
}
catch (Exception)
{
throw;
}
我还通过绑定 CF_Data 实例的每个属性通过 PreparedStatement 和 BatchStatement 插入数据,但是我如何将 CF_Data 的实例(这是要插入的一行)绑定到 PreparedStatement。
PreparedStatement ps = session.Prepare(@"INSERT INTO CF_Data
(
Date,
Name, ....
) " +
"VALUES (now(),?, ?, ?, ?,?,?,?,?,?,?,?,?,?,?,?,?)");
最好的网络拓扑结构(replication_factor、snitch 等)是什么,可以通过足够的数据副本获得最佳性能以避免单点故障?现在我使用的是 simplestrategy & replication_factor of 3。如何像 Cassandra 团队所说的那样快速阅读?
最好不要使用Insert(***)进行海量数据迁移,cassandra提供"Copy ** from **"从csv导入数据,超过6M数据记录可能会超时,越多越好方法是@jorgebg说的是sstableloader加载海量数据肯定能满足你的需求