Java 将数据从cassandra导出到mongodb
我有一个程序,可以直接将数据从Cassandra导出到mongodb。它工作正常,但不会将计数器类型列从Cassandra复制到mongodb。它留下空白Java 将数据从cassandra导出到mongodb,java,mongodb,cassandra,export,Java,Mongodb,Cassandra,Export,我有一个程序,可以直接将数据从Cassandra导出到mongodb。它工作正常,但不会将计数器类型列从Cassandra复制到mongodb。它留下空白 public class Export { static String keyspace = "db1"; static String table = "results"; static String host = "localhost"; @SuppressWarnings("deprecation") static Mongo mon
public class Export
{
static String keyspace = "db1";
static String table = "results";
static String host = "localhost";
@SuppressWarnings("deprecation")
static Mongo mongo = new Mongo("localhost", 27017);
@SuppressWarnings("deprecation")
static DB db = mongo.getDB("mydb");
static DBCollection collection = db.getCollection("results");
public static void main( String[] args ) throws IOException
{
Cluster.Builder clusterBuilder = Cluster.builder()
.addContactPoints(host);
Cluster cluster = clusterBuilder.build();
Session session = cluster.connect(keyspace);
Statement stmt = new SimpleStatement("SELECT * FROM " + table);
stmt.setFetchSize(1);
ResultSet rs = session.execute(stmt);
Iterator<Row> iter = rs.iterator();
ArrayList<String> colName = new ArrayList<String>();
Row row1 = iter.next();
if (row1 != null)
{
for (Definition key1 : row1.getColumnDefinitions().asList())
{
String val = key1.getName();
colName.add(val);
}
}
while (!rs.isFullyFetched())
{
rs.fetchMoreResults();
Row row = iter.next();
if (row != null)
{ BasicDBObject document = new BasicDBObject();
ArrayList<String> ele = new ArrayList<String>();
for (Definition key : row.getColumnDefinitions().asList())
{
String val = myGetValue(key, row);
ele.add(val);
}
for (int i = 0; i < ele.size() && i < colName.size(); i++) {
document.put(colName.get(i), ele.get(i));
}
collection.insert(document);
}
}
session.close();
cluster.close();
}
public static String myGetValue(Definition key, Row row)
{
String str = "";
if (key != null)
{
String col = key.getName();
try
{
if (key.getType() == DataType.cdouble())
{
str = new Double(row.getDouble(col)).toString();
}
else if (key.getType() == DataType.cint())
{
str = new Integer(row.getInt(col)).toString();
}
else if (key.getType() == DataType.uuid())
{
str = row.getUUID(col).toString();
}
else if (key.getType() == DataType.cfloat())
{
str = new Float(row.getFloat(col)).toString();
}
else if (key.getType() == DataType.counter())
{
str = new Float(row.getFloat(col)).toString();
}
else if (key.getType() == DataType.timestamp())
{
str = row.getDate(col).toString();
SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ssZ");
str = fmt.format(row.getDate(col));
}
else
{
str = row.getString(col);
}
} catch (Exception e)
{
str = "";
}
}
return str;
}
}
我知道问题出在哪里。下面的函数没有将计数器的值插入mongodb,因为val被定义为字符串,与Cassandra的计数器数据类型冲突
while (!rs.isFullyFetched())
{
rs.fetchMoreResults();
Row row = iter.next();
if (row != null)
{ BasicDBObject document = new BasicDBObject();
ArrayList<String> ele = new ArrayList<String>();
for (Definition key : row.getColumnDefinitions().asList())
{
String val = myGetValue(key, row);
System.out.println(val);
ele.add(val);
}
for (int i = 0; i < ele.size() && i < colName.size(); i++) {
document.put(colName.get(i), ele.get(i));
}
collection.insert(document);
}
}
while(!rs.isFullyFetched())
{
rs.fetchmoresults();
行=iter.next();
如果(行!=null)
{BasicDBObject document=new BasicDBObject();
ArrayList ele=新的ArrayList();
for(定义键:row.getColumnDefinitions().asList())
{
字符串val=myGetValue(键,行);
系统输出打印项次(val);
元素添加(val);
}
对于(int i=0;i
有人能建议我在函数中需要做的更改吗?您应该使用
getLong()
而不是getFloat()
来检索计数器值,即更改代码:
else if (key.getType() == DataType.counter())
{
str = new Float(row.getFloat(col)).toString();
}
到
顺便说一句,请注意这样一个事实:您不必创建包装类型为
Long
的实例(就像您在所有案例中所做的那样)。使用String.valueOf()
创建值的字符串表示形式 您应该使用getLong()
而不是getFloat()
来检索计数器值,即更改代码:
else if (key.getType() == DataType.counter())
{
str = new Float(row.getFloat(col)).toString();
}
到
顺便说一句,请注意这样一个事实:您不必创建包装类型为Long
的实例(就像您在所有案例中所做的那样)。使用String.valueOf()
创建值的字符串表示形式
else if (key.getType() == DataType.counter())
{
str = String.valueOf(row.getLong(col));
}