【问题标题】:DSE cassandra and spark map collections type: how to perform get operationDSE cassandra 和 spark map 集合类型:如何执行 get 操作
【发布时间】:2015-06-22 07:34:33
【问题描述】:

例如,我有一个名为“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, 字符串

它以地图的形式为我提供地址的所有字段

问题一:但是如何使用“get”来获取“city”信息呢? 问题2:有没有办法让整张桌子变扁? 问题 3:如何计算 "city" = "kl" 的行数?

谢谢

【问题讨论】:

    标签: dictionary collections cassandra apache-spark


    【解决方案1】:

    问题 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)] 将行转换为元组。这使我无需任何转换即可轻松访问地图。 (顺序就是我在测试环境中制作表格时的显示方式,您可能需要更改顺序)

    其次,我想根据 _._2 进行过滤,这是传入元组的第二个元素的简写。 getOrElse 如果键存在则返回键“city”的值,否则返回“NoCity”。最终的等效性检查它是哪个城市。

    最后,我打电话给count,询问该城市的条目数。

    1 我们如何访问地图?

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

    2 如何展平整个表格。

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

    如果您想将地图中的元素展平成一个元组,您可以随时调用toSeq,您最终会得到一个(key,value) 元组列表。如果我还没有回答您对“扁平化”的要求,请随时提出另一个问题。

    【讨论】:

    • 感谢您的出色回答。但是,当我使用它时只是跟进:.filter( _._2.getOrElse("city","NoCity") == "kl" ) .count 它很好,我得到了计数。但是当我使用 '.filter( _._2.get("city") == "kl" ) .count' 我得到计数​​为 0。
    • 这是因为 get 实际上被定义为get(key: A): Option[B],这意味着你得到一个单子,它要么是 Some("value") 要么是 None。这个 monad 永远不会直接等价于字符串。
    猜你喜欢
    • 2018-08-24
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    • 2015-08-24
    • 2019-07-02
    • 2020-05-11
    • 2017-05-22
    • 1970-01-01
    相关资源
    最近更新 更多