当前位置: 首页 > 知识库问答 >
问题:

使用批处理语句插入到卡桑德拉中

程化
2023-03-14

我正在使用批处理语句将来自csv文件的数据插入到卡桑德拉中。我的表格看起来像这样创建表格曝光(暴露比金特,文件比金特,研究文本,项目文本,w文本,x文本,y文本,z文本)

System.out.println(colDataMap);

String  keyspace = "orchtablespaces";
String tabName = fileName;
//String tableFile = "/home/blr-lt-202/empAccount.txt";
String tableFile = fname;

Set<String> colNamesSet = colDataMap.keySet();
String[] colNames = colNamesSet.toArray(new String[colNamesSet.size()]);
System.out.println("ColNames ::" +colNames);

String makeStatement =  makeSt(keyspace,tabName,colNames);

System.out.println("makeStatement ::"+makeStatement);

if(count==65534)
{
    session.executeAsync(bs);
    count = 0;
    bs = new BatchStatement();
}

PreparedStatement statement = session.prepare(makeStatement);
//bcz expo id and seq_n
String expoid =(String) colDataMap.get("expoid");
String Seq_No = (String) colDataMap.get("Seq_No");
colDataMap.put(expoid, Long.valueOf(expoid));
colDataMap.put("Seq_No", Long.valueOf(Seq_No));

BoundStatement query = statement.bind(colDataMap.values().toArray(new Object[colDataMap.size()]));

//BoundStatement query = statement.bind(colDataMap.get("Seq_No"),colDataMap.get("fileId"),colDataMap.get("studyId"),colDataMap.get("projectName"),colDataMap.get("dosetxt"),colDataMap.get("sdurtunit"),colDataMap.get("durtunit"));
System.out.println("query "+query);
bs.add(query);
count++;
}
session.executeAsync(bs);

session.close();

MapColDataMap将所有Cassandra表colNames作为键,它们的值在地图中如下所示

{Seq_No=0, fileId=123, studyId=786, w=PreCLinic, x=Tasq 30mg/kg, y=12 days, z=12 days}
Set<String> colNamesSet =colDataMap.keySet();
String[] colNames = colNamesSet.toArray(new String[colNamesSet.size()]);
System.out.println("ColNames ::" +colNames);

String makeStatement =  makeSt(keyspace,tabName,colNames);

System.out.println("makeStatement ::"+makeStatement);

makeSt方法准备预处理语句

makeStatement ::INSERT INTO orchtablespaces.EXPOSURES ( Seq_No,fileId,studyId,w,x,y,z ) values ( ?,?,?,?,?,?,? )

这一切都很好。然后我做以下事情

PreparedStatement statement = session.prepare(makeStatement);
//bcz expoid and seq_no are of type bigint int the cassandra table
String expoid =(String) colDataMap.get("expoid");
String Seq_No = (String) colDataMap.get("Seq_No");
colDataMap.put(expoid, Long.valueOf(expoid));
colDataMap.put("Seq_No", Long.valueOf(Seq_No));

BoundStatement query = statement.bind(colDataMap.values().toArray(new Object[colDataMap.size()]));

当我运行程序时,我收到以下错误

com.datastax.driver.core.exceptions.NoHostAvailableException.copy(NoHostAvailableException.java:84)
com.datastax.driver.core.DefaultResultSetFuture.extractCauseFromExecutionException(DefaultResultSetFuture.java:289)com.test.load.microarr.CopyOfLoadMicroArr.transformSourceFile(CopyOfLoadMicroArr.java:486)com.test.load.microarr.CopyOfLoadMicroArr.loadData(CopyOfLoadMicroArr.java:149)
com.test.load.microarr.CopyOfLoadMicroArr.main(CopyOfLoadMicroArr.java:114)
Caused by: com.datastax.driver.core.exceptions.NoHostAvailableException: All host(s) tried for query failed (no host was tried)
com.datastax.driver.core.RequestHandler.sendRequest(RequestHandler.java:107)
com.datastax.driver.core.SessionManager.execute(SessionManager.java:538)
com.datastax.driver.core.SessionManager.prepareAsync(SessionManager.java:124)
com.datastax.driver.core.AbstractSession.prepare(AbstractSession.java:77)
    ... 3 more
com.datastax.driver.core.AbstractSession.prepare(AbstractSession.java:79)

程序中断的确切行是第486行,也就是

 PreparedStatement statement = session.prepare(makeStatement);

我正在使用DataStax Cassandra 2.1.8..任何建议和解决方案都会很有帮助!!谢谢!

共有1个答案

欧阳声
2023-03-14

你和卡珊德拉的联系肯定有问题。

形成Datastax Java驱动程序文档:

如果集群中的主机无法成功联系以准备此语句。

并形成错误描述

由于没有主机可用而无法执行查询时引发异常。如果出现以下情况,将引发此异常:

>

  • 要么在查询时集群中没有主机

    由于连接问题,所有尝试过主机都失败了

    出于调试目的,可以使用 errors 方法检索已尝试的主机列表以及失败原因。

    尝试捕捉这个错误并输出尝试过的主机列表——这可以帮助您检测是否有错误的主机或错误的端口。使用< code>getErrors()方法-http://docs . datas tax . com/en/drivers/Java/2.0/com/datas tax/driver/core/exceptions/nohostavailableexception . html # get errors()

  •  类似资料:
    • 我在Datastax java驱动程序中使用了下面的批处理准备语句代码。 这个Batch语句是已记录还是未记录?

    • 我有一个必须添加到采购订单的产品列表。采购订单具有序列号,添加产品后,应更改其状态以指示这些产品已出货。 1 个采购订单中处理的典型产品数为 500。 在DB上-我有2张桌子- 各方面的建议告诉我应该使用多个异步查询。然而,我关心的是整个操作的原子性。鉴于我的要求,请建议什么是最好的前进方式。 先谢谢你。

    • 有人可以帮助我了解如何使用POJO类插入卡桑德拉UDT数据吗? 我创建了一个POJO类来映射Cassandra的表,并为Cassandra UDT创建了另一个类,但是当我插入映射Cassandra表的主POJO类时,它无法识别另一个POJO类(映射Cassandra的UDT)。我还在每个类和每个类对象上编写了注释。 这是我的一个POJO类:- 另一个POJO类:-

    • 我们有这个Cassandra集群,想知道当前的性能是否正常,我们可以做些什么来改善它。 集群由位于同一数据中心的3个节点组成,每个节点的总容量为465GB,堆容量为2GB。每个节点有8个内核和8GB或RAM。不同组件的版本为 工作量描述如下: 空格键使用org.apache.cassandra.locator。SimpleStrategy布局策略和复制因子为3(这对我们非常重要) 工作负载主要由写

    • 我使用的是datastax Cassandra 2.0驱动程序,我在使用预先准备好的绑定语句。假设我想查询如下内容: 其中,UUID1、UUID2、UUID3是UUID值。使用绑定语句实现这一点的编程方法是什么?目前,我正在尝试以下方法: 这当前返回了错误的结果。如何正确格式化查询有何建议?

    • 我使用的是spring数据cassandra,需要使用jpa映射一个字段,在cassandra中,该字段的类型为