我在sql server中有数十亿行数据 . 我们现在转而使用Cassandra作为数据仓库来执行分析工作 . SQL Server将充当OLTP和Cassandra作为OLAP . 数据导入cassandra是通过datastax c#驱动程序执行的 . 我一直在尝试通过datastax c#driver插入cassandra的各种方法 . 什么是插入大量数据的最佳方式?
我创建了各种PCO(Plain cassandra对象),它们是Cassandra Column系列的映射器 . 列族有30多列 .
[Table("CF_Data")]
internal class CF_Data
{
[PartitionKey]
public Guid Date{ get; set; }
public DateTimeOffset Name { get; set; }
.................
}
第一种方法:我正在创建上面的类的实例并将其绑定到批处理语句 . 最后执行每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 3.如何阅读可以像Cassandra团队所说的那样快速闪电?
1 回答
你最好不要使用Insert(*)来执行海量数据迁移,cassandra提供“从复制**”来从csv导入数据,这可能会导致超过6 M的数据记录超时,更好的方法是@jorgebg说是加载大量数据的sstableloader,肯定会满足你的需求 .