DSE cassandra 和 spark 地图集合类型:如何执行获取操作

DSE cassandra and spark map collections type: how to perform get operation

例如我有以下 table 命名为 "example":

  name      |       age       |       address

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

在 Spark 中我可以这样做:

scala> val test = sc.cassandraTable ("test","example")

还有这个:

scala>test.first.getString

还有这个:

scala> test.first.getMapString, 字符串

它以地图的形式给出了地址的所有字段

问题 1:但是如何使用 "get" 访问 "city" 信息? 问题2:有没有办法把整个table弄平? 问题 3:如何计算 "city" = "kl" 的行数?

谢谢

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

我会先回答 3,因为这可能会为您提供一种更简单的处理数据的方法。像

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

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

其次,我想根据 _._2 进行过滤,即传入元组的第二个元素 shorthand。 getOrElse return 如果键存在,则为键“city”的值,否则为“NoCity”。最后的等价检查它是哪个城市。

最后,我调用count查询城市的条目数。

1 我们如何访问地图?

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

2 如何把整个table.

根据您所说的“扁平化”的含义,这可能有多种含义。例如,如果你想 return 整个 table 作为驱动程序的数组(不推荐,因为你的 RDD 在生产中应该非常大。)你可以调用 collect

如果您想将地图的元素展平为一个元组,您可以随时执行类似调用 toSeq 的操作,您最终会得到一个 (key,value) 元组的列表。如果我没有用“扁平化”回答您想要的内容,请随时提出另一个问题。