Showing posts with label b1505| toMap(). Show all posts
Showing posts with label b1505| toMap(). Show all posts

zipWithIndex() Example

ZipWithIndex() assigns and index to each element in array converting all the elements into a tuple of (element, index)

Example : Filter Header from Header+Data
scala> class Header(myHeader: Array[String])  {
     |   val temp = myHeader.zipWithIndex
     |   temp.foreach(println)
     |   val index = temp.toMap
     |   println(s"index -> $index")
     |   def apply(someHeader: Array[String], key:String):String = {
     |      someHeader(index(key)) 
     |   }
     | }
defined class Header

scala> val myString = "user,product,review"
myString: String = user,product,review

scala> val myList = myString.split(",")
myList: Array[String] = Array(user, product, review)

scala> val myHeader = new Header(myList)
(user,0)
(product,1)
(review,2)
index -> Map(user -> 0, product -> 1, review -> 2)
myHeader: Header = Header@2afb775a

scala> val someData = List("user,product,review", "user1,toy1,rating1", 
     |                               "user2,toy2,rating3")
someData: List[String] = List(user,product,review, user1,toy1,rating1, user2,toy2,rating3)

scala> val mapped = someData.map{ x =>
     |   val splitted = x.split(",")
     |   splitted
     | }
mapped: List[Array[String]] = List(Array(user, product, review), Array(user1, toy1, rating1), Array(user2, toy2, rating3))

scala> val dataOnly = mapped.filter { x =>
     |   myHeader(x, "user") != "user"
     | }
dataOnly: List[Array[String]] = List(Array(user1, toy1, rating1), Array(user2, toy2, rating3))
c116 > a12

Data Conversion using : Map, for/yield etc...

scala> // Step 1

scala> val inputList = List(  "data=first data || key1=r1v1 || key2=",
     |                        "data=second data || key1=r2v1 || key2=r2v2",
     |                        "key1=r3v1"
     |                       )
inputList: List[String] = List(data=first data || key1=r1v1 || key2=, data=second data || key1=r2v1 || key2=r2v2, key1=r3v1)

scala> // Step 2

scala> val splitted = inputList.map{ x =>
     |   x.split("\\|\\|")
     |    .map(_.trim)
     | }
splitted: List[Array[String]] = List(Array(data=first data, key1=r1v1, key2=), Array(data=second data, key1=r2v1, key2=r2v2), Array(key1=r3v1))

scala> // Step 3

scala> val filteredList = splitted.map{ x =>
     |   val retval = for { element <- x
     |       val keyNval = element.split("=")
     |       if keyNval.size >= 2
     |     } yield {
     |       val splitted = element.split("=")
     |       // Create Tuple of Key and Value
     |       splitted(0) -> splitted(1)
     |     }
     |   retval
     | }
warning: there were 1 deprecation warning(s); re-run with -deprecation for details
filteredList: List[Array[(String, String)]] = List(Array((data,first data), (key1,r1v1)), Array((data,second data), (key1,r2v1), (key2,r2v2)), Array((key1,r3v1)))

scala> // Step 4

scala> val dnryList = filteredList.map{ x =>
     |   x.toMap
     | }
dnryList: List[scala.collection.immutable.Map[String,String]] = List(Map(data -> first data, key1 -> r1v1), Map(data -> second data, key1 -> r2v1, key2 -> r2v2), Map(key1 -> r3v1))

scala> // Step 5

scala> val filteredDnryList = dnryList.filter{ x =>
     |   if (x.getOrElse("data", ()) != ())
     |     true
     |   else
     |     false
     | }
filteredDnryList: List[scala.collection.immutable.Map[String,String]] = List(Map(data -> first data, key1 -> r1v1), Map(data -> second data, key1 -> r2v1, key2 -> r2v2))

scala> // Step 6

scala> val keyvaluepairs = filteredDnryList.map { x =>
     |   val data = x.getOrElse("data", "")
     |   (data, x)
     | }
keyvaluepairs: List[(String, scala.collection.immutable.Map[String,String])] = List((first data,Map(data -> first data, key1 -> r1v1)), (second data,Map(data -> second data, key1 -> r2v1, key2 -> r2v2)))

scala> // Step 7

scala> val words = keyvaluepairs.flatMap{ x =>
     |   //Underscore (_) is used as a Placeholder indicator
     |   val xsplitted = x._1.split(" ").map(_.trim)
     |   val wordNmeta = for { element <- xsplitted
     |     } yield {
     |       (element, x._2)
     |     }
     |   wordNmeta
     | }
words: List[(String, scala.collection.immutable.Map[String,String])] = List((first,Map(data -> first data, key1 -> r1v1)), (data,Map(data -> first data, key1 -> r1v1)), (second,Map(data -> second data, key1 -> r2v1, key2 -> r2v2)), (data,Map(data -> second data, key1 -> r2v1, key2 -> r2v2)))
c200 > a15