例如,我有下表名为"示例":
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"?
由于
答案 0 :(得分:2)
我将首先回答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
,了解该市的参赛人数。
所以2的答案是,一旦你有了Map,就可以调用get(“key”)或getOrElse(“key”)或任何标准的Scala操作来从地图中获取一个值。
根据“扁平化”的含义,这可能是各种各样的事情。例如,如果您想将整个表作为数组返回给驱动程序(不建议这样做,因为您的RDD在生产中应该非常大。)您可以调用toSeq
如果您想将地图元素拼合为元组,您可以随时执行调用(key,value)
之类的操作,最终会得到{{1}}元组列表。如果我没有用“扁平化”回答你想要的东西,请随意提出另一个问题。