【问题标题】:Interfacing cassandra with JDBC getting odd hex将 cassandra 与 JDBC 接口变得奇怪的十六进制
【发布时间】:2012-02-28 06:09:14
【问题描述】:

我用 hector 插入数据并用 JDBC 取回数据。

除了索引列之外,数据没有任何意义,我知道这是因为 cassandra 将数据存储为字节,然后在读取时转换它(客户端转换它)

有人知道如何在 JDBC for cassandra 中执行此操作吗?

我的代码:

public static void main(String[] args) throws SQLException
    {
        Connection con = null;
        String _KS = "StringMsg";
        String _CFDef = "Tweets";

        try 
        {
            Class.forName("org.apache.cassandra.cql.jdbc.CassandraDriver");
            con = DriverManager.getConnection("jdbc:cassandra://localhost:9160/" + _KS);

            String query = "SELECT username, email, msg, id FROM " + _CFDef + " WHERE 'username'='LTodorov'";

            Statement stmt = con.createStatement();
            ResultSet result = stmt.executeQuery(query);

            System.out.println("hi");
            int i=0;
            while (result.next())
            {
                System.out.println(result.getString("id"));
                System.out.println(result.getString("username"));
                System.out.println(result.getString("msg"));
                System.out.println(result.getString("email"));
                System.out.print("count:" + i + "\n\n");i++;
            }
        } 
        catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        catch (SQLException e) {
            e.printStackTrace();
        }
        finally 
        {
            if (con != null) 
            {
                try 
                {
                    con.close();
                } 
                catch (SQLException e) 
                {
                    e.printStackTrace();
                }
                con = null;
            }
        }
    }

结果:

hi
java.nio.HeapByteBuffer[pos=237 lim=258 cap=798]
LTodorov
java.nio.HeapByteBuffer[pos=184 lim=209 cap=798]
java.nio.HeapByteBuffer[pos=144 lim=155 cap=798]
count:0

Cli 结果:

GET Tweets Where username=LTodorov;
-------------------
RowKey: LTodorov1330045080096
=> (column=email, value=6c5f6c74404162762e6267, timestamp=1330045080214000)
=> (column=id, value=4c546f646f726f7631333330303435303830303936, timestamp=13300
45080098000)
=> (column=msg, value=54686973206973206d616b696e67206d652073616466616365, timest
amp=1330045080210000)
=> (column=username, value=LTodorov, timestamp=1330045080217000)

带有“假设推文验证器为 utf8”的 Cli 结果;

RowKey: LTodorov1330045080096
=> (column=email, value=l_ld@Abv.bg, timestamp=1330045080214000)
=> (column=id, value=LTodorov1330045080096, timestamp=1330045080098000)
=> (column=msg, value=This is making me sadface, timestamp=1330045080210000)
=> (column=username, value=LTodorov, timestamp=1330045080217000)

列族定义:

CREATE COLUMN FAMILY Tweets
WITH comparator = UTF8Type
AND key_validation_class=UTF8Type
AND column_metadata = [
{column_name: id, validation_class: UTF8Type}
{column_name: email, validation_class: UTF8Type}
{column_name: msg, validation_class: UTF8Type}
{column_name: user, validation_class: UTF8Type}

任何 cassandra 大师有任何指示吗?我正在取回数据,但它应该在 java 中转换,还是应该由 JDBC api 完成工作,或者它是一个 cassandra 的东西? (我认为这不能由 cassandra 解决)

【问题讨论】:

    标签: java jdbc cassandra command-line-interface cql


    【解决方案1】:

    我认为你应该能够在你的 java 类中做到这一点。结果集返回一些数据类型,查看方法getBytes()。您可以将字节值重构为String。例如

    String string_username = new String(result.getBytes("username"), "UTF-8");
    System.out.println(string_username);
    

    【讨论】:

    • 你的意思是错误处理?我可以想到很多方法,例如,在日志记录中将其记录为错误,无论哪个类调用此类方法,如果出现此错误,他们必须进行其他必要的更改,或者可能有一个小的 try-catch 块围绕上面的两个语句并尝试使用其他字符集进行解码或从结果中调用其他方法。但我认为您有很好的做法,也就是说,您可以通过首先定义列元数据来预防错误处理。那很好! :-)
    【解决方案2】:

    对我来说,这看起来像是 JDBC 驱动程序中的一个错误。如果 CLI 中的列是 UTF8Type(即 CQL 中的 text/varchar 类型),那么您应该能够只使用 ResultSet.getString。

    您可以将 JDBC 错误报告给http://code.google.com/a/apache-extras.org/p/cassandra-jdbc/issues/list

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-14
      • 2014-02-12
      • 2013-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      相关资源
      最近更新 更多