在公司里实习,经常讲究的是需求,实际上需求也是由诸多小模块拼接在一起完成的。上周遇到一个问题,就是需要把一个二维数组转化为一个对应的Map,举个栗子,我得到了一个数组:Array(Array(“a”,1),Array(“b”,2),Array(“c”,3)) 转化为Map(a->1,b->2,c->3)
使用Array的map方法和case class 先把数组转化为Tuple,再用Tuple的toMap方法转化为Map。这个方法在spark程序中对RDD的操作同样适用。如下:
Array(Array("a",1),Array("b",2),Array("c",3))//Array[Array[Any]]
Array(Array("a",1),Array("b",2),Array("c",3)).map{case Array(x,y)=>(x,y)}//Array[(Any, Any)]
Array(Array("a",1),Array("b",2),Array("c",3)).map{case Array(x,y)=>(x,y)}.toMap//Map[Any,Any]
由于处理的数据量较大、计算是分布式完成的,所以最后得到的结果通常会将其保存为多个文件。如果需要将文件保存为一个文件,可以用coalesce(1,true).saveAsTextFile(),这意味着并行计算,然后合并到一个分区。也可以使用repartition(1).saveAsTextFile()。但如果你有很多数据,那可能并不是很好,每个拆分生成的单独文件就像Hadoop中的那样,方便让不同的映射器和还原器写入不同的文件。如果数据很少,那么只有一个输出文件比较合理。在这种情况下,也可以collect()。
上周写代码遇到一件有意思的事情:本来一个很简单的切割,结果死活不对,简化如下,
val a="a,bc,def,ghij" //a: String = a,bc,def,ghij
a.split(",") //res1: Array[String] = Array(a, bc, def, ghij)
val a="a|bc|def|ghij" //a: String = a|bc|def|ghij
a.split("|") //res2: Array[String] = Array(a, |, b, c, |, d, e, f, |, g, h, i, j)
a.split("\\|") //res3: Array[String] = Array(a, bc, def, ghij)
改来改去结果发现,短竖线的切割需要用”\|”来表示!
使用mkString方法来打印一个集合内容,下面是一个简单的例子:
val a = Array("apple", "banana", "cherry") //a: Array[String] = Array(apple, banana, cherry)
a.mkString //res3: String = applebananacherry
结果并不怎么好看,增加一个分隔符:
a.mkString(",")//res4: String = apple,banana,cherry
a.mkString(" ")//res5: String = apple banana cherry
a.mkString("[", ", ", "]")//res6: String = [apple, banana, cherry]
将一个嵌套的集合转化为一个字符串,如嵌套数组,首先需要展开这个嵌套数组,然后调用mkString方法:
val a = Array(Array("a", "b"), Array("c", "d"))//a: Array[Array[String]] = Array(Array(a, b), Array(c, d))
a.flatten.mkString(",")//res7: String = a,b,c,d
转化为字符串也可以直接调用集合的toString方法,但是它返回集合名称信息。
JSON数据格式只有两种形式:对象和数组。判断json文件字符串是JSONObject还是JSONArray,分别是:
{"key": "value"} //JSONObject(对象)
[{"key1": "value1"}, {"key2": "value2"}] //JSONArray(数组)
JSONObject可以用key取值,JSONArray只能遍历取值。JSONObject和JSONArray的API链接:
http://json-lib.sourceforge.net/apidocs/jdk15/net/sf/json/JSONObject.html
http://json-lib.sourceforge.net/apidocs/net/sf/json/JSONArray.html
一个简单的示例:
val str2 = "{\"et\":\"kanqiu_client_join\",\"vtm\":1435898329434,\"body\":{\"client\":\"866963024862254\",\"client_type\":\"android\",\"room\":\"NBA_HOME\",\"gid\":\"\",\"type\":\"\",\"roomid\":\"\"},\"time\":1435898329}"
println("1"+str2)
val json = JSON.parseObject(str2)
println("2"+json)
val fet = json.get("body")//获取成员
println("3"+fet)
val etString = json.getString("et")//返回字符串成员
println("4"+etString)
val vtm = json.getInteger("vtm")//返回整形成员
println("5"+vtm)
val client = json.getJSONObject("body").get("client")//返回对象下多级成员
println("6"+client)