[問題] 如何寫入資料庫(Cassandra)

看板java作者 (假嗨)時間12年前 (2013/07/24 18:48), 編輯推噓1(109)
留言10則, 3人參與, 最新討論串1/1
小弟依舊不材,始終改寫不出我想要的程式碼 (努力看參考資料到半夜還是不會,我好弱.....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

07/24 18:49, , 1F
我的"材"打錯了,抱歉! "材→才"
07/24 18:49, 1F

07/24 18:53, , 2F
不知道文章是否違版規,若有請告知我,我會改善
07/24 18:53, 2F

07/24 19:38, , 3F
我覺得你的問題跟excel和cassandra沒太大關係...
07/24 19:38, 3F

07/24 19:41, , 4F
key_user_id用int遞增 insert之前再轉成字串應該就好了
07/24 19:41, 4F

07/24 21:39, , 5F
String.valueOf() 拿去配
07/24 21:39, 5F

07/24 21:59, , 6F
太感謝W大的方法,我會這個使用方法了,謝謝!!
07/24 21:59, 6F

07/24 22:15, , 7F
和realmeat大提供的方法,感謝!
07/24 22:15, 7F

07/24 22:18, , 8F
目前還在努力怎抓到資料後再匯入資料庫的程式寫法....
07/24 22:18, 8F

07/24 22:33, , 9F
突然寫的靈感一直湧現,感覺快成功了....(通靈了!)
07/24 22:33, 9F

07/25 03:03, , 10F
我寫出來了!真開心...很感謝各位的幫助!
07/25 03:03, 10F
文章代碼(AID): #1Hxx49FE (java)