【问题标题】:How getSet of Text from row in cassandra如何从 cassandra 的行中获取文本集
【发布时间】:2018-04-04 05:27:38
【问题描述】:

我有一个带有 > > 列的表。我无法理解如何从一行中读取列值。尝试在下面但无法通过。

  else if (key.getType() == DataType.frozenSet(text))
                    {
                str  =  row.getSet( , )
                    }

我尝试了下面的方法,但我发现该冻结集列没有打印任何内容。

    public static void main(String[] args) throws FileNotFoundException {
    long startTime = System.currentTimeMillis();

    PrintWriter pw = new PrintWriter(new File("test.csv"));
            String keyspace = "xxxxx";
            String table = "xxxxxx";
            String username = "xxxx";
            String password = "xxxx";
            String host     = "xxxxxxx";
            double count = 0;


            Cluster.Builder clusterBuilder = Cluster.builder()
                                            .addContactPoints(host)
                                            .withCredentials(username, password);
            Cluster cluster = clusterBuilder.build();
            Session session = cluster.connect(keyspace);

            Statement stmt = new SimpleStatement("SELECT * FROM " + table);
            stmt.setFetchSize(2000);
            ResultSet rs = session.execute(stmt);
            Iterator<Row> iter = rs.iterator();

            while ( !rs.isFullyFetched()) {
              if (rs.getAvailableWithoutFetching() == 120 )
               rs.fetchMoreResults();
               Row row = iter.next();
               if ( rs != null )
               {
                       StringBuilder line = new StringBuilder();
                       for (Definition key : row.getColumnDefinitions().asList())
                       {
                               String val = myGetValue(key, row);
                               line.append("\"");
                               line.append(val);
                               line.append("\"");
                               line.append(',');
                       }
                       line.deleteCharAt(line.length()-1);
                       line.append('\n');
                       pw.write(line.toString());


                       System.out.println(line.toString());
                       ++count;
               }
            }
            pw.close();
            session.close();
            cluster.close();
            System.out.println(count + "\t rows copied into csv");
            long endTime = System.currentTimeMillis();
            System.out.println("Took "+(endTime - startTime) + " ms"); 
        }
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.timestamp())
            {
                    str = row.getDate(col).toString();
                   SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ssZ");
                    str = fmt.format(row.getDate(col));


            }

               else if (key.getType().equals(DataType.set(DataType.text()) ))
            { 
                    Set<String> st1 = row.getSet(i, String.class);
                   str = st1.toString();
                    ++i;
            }


            else
            {
                    str = row.getString(col);
            }
            } catch (Exception e)
            {
                 str = "";     
            }
    }

    return str;
}
}

架构:

create table view_page_details(
  clickid uuid,
  view text,
  clickin int,
  names frozen <set<text>>,
  msg_view text,
  number_of_times int,
  primary key ((clickid, view, clickin), names);

该表中特定“名称”列的 cqlsh 输出:

|                                 {').'{'2', 'STOP', 'williams', 'The', 'appts:', 'at', 'family''s', 'first', 'of', 'one', 'reminder', 'starts', 'to', 'your'}

|                                 {'2'{'2', 'STOP', 'shane', 'The', 'appts:', 'at', 'family''s', 'first', 'of'}

|                      {'1', '2/1/15.'{'2', 'STOP', 'brete', 'The', 'appts:', 'at', 'family''s', 'first', 'of', 'one', 'reminder', 'starts', 'to', 'your'}

该表中该特定“名称”列的程序输出:

                           ,,
                           ,,
                           ,,
                           ,,

从我观察到的逐行调试,String val = myGetValue(key, row);从集群中正确获取整个行值,当从该函数返回值时,它没有给出指定的列值。不确定该特定列的函数逻辑内部是否有问题。

【问题讨论】:

  • 你的++i; 放错地方了。 i 应该保存“列的索引”的值。在您的代码中,它似乎包含“已处理的集合数”

标签: java cassandra datastax-java-driver


【解决方案1】:

第一个参数是 ResultSet 中列的索引。 通过这种方式访问​​,您需要通过索引而不是名称或键来获取列。

Set<String> mySet  =  row.getSet(index, String.class);

如果您没有索引,那么您需要在迭代键时保留一个计数器。

您可以从 javadoc 中找到更多信息

https://docs.datastax.com/en/latest-java-driver-api/com/datastax/driver/core/GettableByIndexData.html#getSet-int-java.lang.Class-

更长的答案: 我真的在猜你的大部分代码是做什么的,但是使用给定的架构,我可以使用以下代码输出集合:

        Row row = rs.one();
        String str = "";

        int i = 0;
        Iterator<ColumnDefinitions.Definition> it = rs.getColumnDefinitions().iterator();
        while (it.hasNext()) {
            ColumnDefinitions.Definition key = it.next();
            if (key.getType().equals(DataType.set(DataType.varchar()))) {
                Set<String> st1 = row.getSet(i, String.class);
                str = st1.toString();
                System.out.println(str);
            }
            i++;
        }

【讨论】:

  • 我按照您的建议尝试了,但没有打印出来。我扩展了我的问题。
  • 你能包含你的架构吗?
  • 在问题中添加。
  • 我认为问题在于您使用 == 的 IF 语句没有为该架构返回 true。 (顺便说一句,变量 'text' 是什么)它适用于我的 if (key.getType().equals(DataType.set(DataType.varchar()))) {
  • 我已经添加了我正在尝试做的代码。在 if 条件中更改为等于,程序仍然为该列打印空白。不确定,但我的示例代码只有表中的集合字段存在问题。
猜你喜欢
  • 2018-09-08
  • 2017-08-14
  • 1970-01-01
  • 2014-12-24
  • 1970-01-01
  • 1970-01-01
  • 2014-04-27
  • 1970-01-01
相关资源
最近更新 更多