DSE cassandra和spark map集合类型:如何执行get操作

时间:2015-04-16 04:44:40

标签: dictionary collections cassandra apache-spark

例如,我有下表名为"示例":

  name      |       age       |       address

  'abc'     |       12        | {'street':'1', 'city':'kl', 'country':'malaysia'}
  'cab'     |       15        | {'street':'5', 'city':'jakarta', 'country':'indonesia'}

在Spark我可以这样做:

阶> val test = sc.cassandraTable(" test","示例")

和此:

阶> test.first.getString

和此:

阶> test.first.getMapString,String

以地图的形式给我地址的所有字段

问题1 :但我如何使用" get"访问" city"信息? 问题2 :有没有办法整理整个桌子? 问题3 :如何计算" city" =" kl"?

由于

1 个答案:

答案 0 :(得分:2)

问题3:我们如何计算city == something

的行数

我将首先回答3,因为这可能为您提供更简单的数据处理方式。像

这样的东西
sc.cassandraTable[(String,Map[String,String],Int)]("test","example")
 .filter( _._2.getOrElse("city","NoCity") == "kl" )
 .count

首先,我在[(String,Map[String,String],Int)]调用中使用类型参数cassandraTable将行转换为元组。这使我可以轻松访问地图而无需任何演员。 (顺序就是我在测试环境中制作表格时的显示方式,您可能需要更改顺序)

其次我说我想基于_._2进行过滤,getOrElse是传入元组的第二个元素的简写。如果密钥存在,则count返回密钥“city”的值,否则返回“NoCity”。最终的等价物检查它是哪个城市。

最后,我致电collect,了解该市的参赛人数。

1我们如何访问地图?

所以2的答案是,一旦你有了Map,就可以调用get(“key”)或getOrElse(“key”)或任何标准的Scala操作来从地图中获取一个值。

2如何压平整个桌子。

根据“扁平化”的含义,这可能是各种各样的事情。例如,如果您想将整个表作为数组返回给驱动程序(不建议这样做,因为您的RDD在生产中应该非常大。)您可以调用toSeq

如果您想将地图元素拼合为元组,您可以随时执行调用(key,value)之类的操作,最终会得到{{1}}元组列表。如果我没有用“扁平化”回答你想要的东西,请随意提出另一个问题。