Вставка в Кассандру с использованием пакетных операторов

Я вставляю данные в Cassandra, поступающие из CSV-файла, используя пакетные операторы. Моя таблица выглядит так: создайте экспозиции таблицы (expoid bigint, fileid bigint, studyid text, текст projname, w text, x text, y text, z text)

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 имеет все имена полей таблицы Кассандры в качестве ключа и их значения на карте, как показано ниже

{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 ответ

У вас определенно есть проблемы с подключением к кассандре.

Сформируйте документацию по драйверу Java Datastax:

NoHostAvailableException - если ни один хост в кластере не может быть успешно установлен, чтобы подготовить этот оператор.

И сформируйте описание ошибки

Исключение выдается, когда запрос не может быть выполнен, потому что хост недоступен. Это исключение выдается, если

  • либо в кластере нет живого хоста на момент запроса

  • все хосты, которые были опробованы, потерпели неудачу из-за проблемы с подключением

В целях отладки список узлов, которые были опробованы вместе с причиной сбоя, можно получить с помощью метода ошибок.

Попробуйте перехватить эту ошибку и вывести список проверенных хостов - это может помочь вам обнаружить, есть ли неправильный хост или неправильный порт. использование getErrors() метод - http://docs.datastax.com/en/drivers/java/2.0/com/datastax/driver/core/exceptions/NoHostAvailableException.html

Другие вопросы по тегам