【问题标题】:How to use Map<String,Long> for datastax如何将 Map<String,Long> 用于 datastax
【发布时间】:2014-11-18 09:06:06
【问题描述】:

我正在使用 datastax 并想从 Cassandra 中检索地图

Cassandra 有 String,bigint 的映射,bigint 在 Java 中映射到 long 但我不能有原始类型的 Map。那么如何使用地图呢?

下面是我的建表脚本

CREATE TABLE IF NOT EXISTS dealsstorea.deals1( 
   otla text, 
   dtla text , 
   **types Map < text,bigint >**, 
   travelers bigint, 
   pkgRatePlanCode text, 
   pkgRoomTypeCode text,
   numRooms bigint, 
   PRIMARY KEY ((...),
    ..));

【问题讨论】:

    标签: hashmap cassandra cql datastax


    【解决方案1】:

    如果我正确理解您的问题,您正在使用 Java 驱动程序从具有 Map 类型列的 CQL 表中进行选择,并且您希望将其加载到 Java 对象中。

    如果是这种情况,请使用 Java TreeMap

    Map<String, Long> myMap = new TreeMap<String, Long>();
    

    Java 类型 String 和 Long 分别映射到 CQL 文本和 bigint。

    【讨论】:

    • 我尝试了整数,但出现以下错误。我也尝试了很长时间,这种情况下的错误是 java.lang.Integer 和 cassandra int 不匹配。这是 int 的错误“列类型是类 java.lang.String->class java.lang.Integer 的映射(CQL 类型映射),不能作为类 java 的映射检索.lang.String->int"
    【解决方案2】:

    下面的代码我用来将地图数据类型转换为字符串。

    --------代码-----------

    public static String getMaptoSring(DataType dataType, Row row, String columnName) 抛出 ClassNotFoundException {

      String  mapstr = "";
     if(row.getColumnDefinitions().getType(columnName).getName().name().equalsIgnoreCase("map"))
     {           
         Map<?, ?> map = row.getMap(columnName, Class.forName("java.lang.String"), Class.forName("java.lang.String"));
         Set<?> set = map.keySet();
         Iterator setIterator = set.iterator();
         while(setIterator.hasNext()){
             Object key = setIterator.next();
             String value = map.get(key).toString();
             if(mapstr =="" )
                 mapstr="{"+key.toString()+":"+value;
             else
                 mapstr = mapstr+","+key.toString()+":"+value;
    
         }
         mapstr = mapstr+"}"; 
    
         //System.out.println("Map Key and value are as following: Key :: "+ key.toString() + ", value :: "+ value);
    
     }
     return mapstr;
    

    }

    【讨论】:

    • 我可能不清楚,但基本上,在 cassandra 表中,我有一个 的地图,我将其检索为 resultRow.getMap("types", String.class, int 。班级);进入 Map 并失败并出现错误 “列类型是类 java.lang.String->class java.lang.Integer 的映射(CQL 类型映射),不能检索为类 java.lang.String->int" 的映射。所以现在,我不得不将 Cassandra 中的 Map 作为 String,String 来解决这个问题。在 cassandra 中保留 String,int 的任何更好的解决方案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-06
    • 2020-09-04
    • 2019-07-31
    • 1970-01-01
    • 1970-01-01
    • 2016-06-14
    • 1970-01-01
    相关资源
    最近更新 更多