作者brandonron (假嗨)
看板java
標題[問題] 如何寫入資料庫(Cassandra)
時間Wed Jul 24 18:48:38 2013
小弟依舊不材,始終改寫不出我想要的程式碼
(努力看參考資料到半夜還是不會,我好弱.....Orz)
但放棄就是代表我認輸,還是要上來發問解惑!
希望有高手的寫法能幫助我,讓我效法你的高超程式能力........
---------------------------參考:Thrift Example JAVA-----------------------
package com.test;
import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.util.List;
import org.apache.cassandra.thrift.Cassandra;
import org.apache.cassandra.thrift.Column;
import org.apache.cassandra.thrift.ColumnOrSuperColumn;
import org.apache.cassandra.thrift.ColumnParent;
import org.apache.cassandra.thrift.ColumnPath;
import org.apache.cassandra.thrift.ConsistencyLevel;
import org.apache.cassandra.thrift.InvalidRequestException;
import org.apache.cassandra.thrift.NotFoundException;
import org.apache.cassandra.thrift.SlicePredicate;
import org.apache.cassandra.thrift.SliceRange;
import org.apache.cassandra.thrift.TimedOutException;
import org.apache.cassandra.thrift.UnavailableException;
import org.apache.thrift.TException;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.transport.TFramedTransport;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;
public class WriteData
{
public static void main(String[] args)
throws TException, InvalidRequestException, UnavailableException,
UnsupportedEncodingException, NotFoundException, TimedOutException
{
//client 連線設定
TTransport tr = new TFramedTransport(new TSocket("localhost",
9160));
TProtocol proto = new TBinaryProtocol(tr);
Cassandra.Client client = new Cassandra.Client(proto);
tr.open();
String key_user_id = "1"; //row_key值
// insert data line 39~65
long timestamp = System.currentTimeMillis();
//keyspace1=keyspace_name 如同Excel案名稱(workbook)
client.set_keyspace("keyspace1");
//test=column_family_name 如同 Excel內的分頁名稱(sheekname)
ColumnParent parent = new ColumnParent("test"); //column_family_name
//insert 一筆資料:name、age
Column nameColumn = new Column(toByteBuffer("name"));
//column_field_name
nameColumn.setValue(toByteBuffer("Chris Goffinet"));
//column_field_value
nameColumn.setTimestamp(timestamp);
/*
* cassandra-cli insert
* >>set column_family_name [row_key] [column_name] ='value';
*/
client.insert(toByteBuffer(key_user_id), parent, nameColumn,
ConsistencyLevel.ONE);
Column ageColumn = new Column(toByteBuffer("age"));
//column_field_name
ageColumn.setValue(toByteBuffer("24")); //column_field_value
ageColumn.setTimestamp(timestamp);
client.insert(toByteBuffer(key_user_id), parent, ageColumn,
ConsistencyLevel.ONE);
ColumnPath path = new ColumnPath("test");
// read single column
path.setColumn(toByteBuffer("name"));
System.out.println(client.get(toByteBuffer(key_user_id), path,
ConsistencyLevel.ONE));
/*
* path.setColumn(toByteBuffer("age"));
* System.out.println(client.get(toByteBuffer(key_user_id), path,
ConsistencyLevel.ONE));
*/
//row read entire
SlicePredicate predicate = new SlicePredicate();
SliceRange sliceRange = new SliceRange(toByteBuffer(""),
toByteBuffer(""), false, 10);
predicate.setSlice_range(sliceRange);
List<ColumnOrSuperColumn> results =
client.get_slice(toByteBuffer(key_user_id), parent, predicate,
ConsistencyLevel.ONE);
for (ColumnOrSuperColumn result : results)
{
Column column = result.column;
System.out.println(toString(column.name) + " -> " +
toString(column.value));
}
tr.close();
}
public static ByteBuffer toByteBuffer(String value) throws
UnsupportedEncodingException
{
return ByteBuffer.wrap(value.getBytes("UTF-8"));
}
public static String toString(ByteBuffer buffer) throws
UnsupportedEncodingException
{
byte[] bytes = new byte[buffer.remaining()];
buffer.get(bytes);
return new String(bytes, "UTF-8");
}
}
-------------------------------------我的問題---------------------------------
假如Excel內有5筆資料(自己建立的測試資料);rows=5,column=2
而上面程式碼是將寫入的資料先寫在程式碼內來進行插入(name、age)
其中row_key(=key_user_id)是唯一值,我有想過用迴圈來改變它
讓每次插入一筆完整資料(設定row_key初始值1)後,下一筆row_key=row_key+1
但它寫法是String的方式,我試著改用int就失敗了。(不符合它的toByteBuffer用法)
Q:我要如何改寫上述程式才能將我要的Excel的資料依序的匯入資料庫,
且每筆row_key值不會相同?
(有寫一個Java 讀取Excel的程式,不知道是否有需要PO上來看)
我想學會這個方法跟觀念,求高手詳細些寫法,讓我這新手更加進步(懇求您教我)
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.127.218.68
→ brandonron:我的"材"打錯了,抱歉! "材→才" 07/24 18:49
→ brandonron:不知道文章是否違版規,若有請告知我,我會改善 07/24 18:53
推 wannawanna:我覺得你的問題跟excel和cassandra沒太大關係... 07/24 19:38
→ wannawanna:key_user_id用int遞增 insert之前再轉成字串應該就好了 07/24 19:41
→ realmeat:String.valueOf() 拿去配 07/24 21:39
→ brandonron:太感謝W大的方法,我會這個使用方法了,謝謝!! 07/24 21:59
→ brandonron:和realmeat大提供的方法,感謝! 07/24 22:15
→ brandonron:目前還在努力怎抓到資料後再匯入資料庫的程式寫法.... 07/24 22:18
→ brandonron:突然寫的靈感一直湧現,感覺快成功了....(通靈了!) 07/24 22:33
→ brandonron:我寫出來了!真開心...很感謝各位的幫助! 07/25 03:03