Scala笔记(二):Array转换成Map,saveAsTextFile保存为一个文件,短竖线分割,mkString方法,JSON数组与对象

1.Array转换成Map

在公司里实习,经常讲究的是需求,实际上需求也是由诸多小模块拼接在一起完成的。上周遇到一个问题,就是需要把一个二维数组转化为一个对应的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]

2.saveAsTextFile保存为一个文件

由于处理的数据量较大、计算是分布式完成的,所以最后得到的结果通常会将其保存为多个文件。如果需要将文件保存为一个文件,可以用coalesce(1,true).saveAsTextFile(),这意味着并行计算,然后合并到一个分区。也可以使用repartition(1).saveAsTextFile()。但如果你有很多数据,那可能并不是很好,每个拆分生成的单独文件就像Hadoop中的那样,方便让不同的映射器和还原器写入不同的文件。如果数据很少,那么只有一个输出文件比较合理。在这种情况下,也可以collect()。

3.短竖线分割问题

上周写代码遇到一件有意思的事情:本来一个很简单的切割,结果死活不对,简化如下,

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)

改来改去结果发现,短竖线的切割需要用”\|”来表示!

4.通过mkString方法将一个集合转化为一个字符串

使用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方法,但是它返回集合名称信息。

5.JSON数组与对象

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)

你可能感兴趣的:(Scala笔记(二):Array转换成Map,saveAsTextFile保存为一个文件,短竖线分割,mkString方法,JSON数组与对象)