val codeRDD = HBase_DATARDD.map(
o => {
val age = Bytes.toString(o._2.getValue("info".getBytes, "age".getBytes)).toInt
val code = Bytes.toString(o._2.getValue("info".getBytes, "code".getBytes)).toInt
(age,code)
}
).map(o => o._1)
//关于Tuple1
package scala
case class Tuple1[ @scala.specialized +T1](val _1 : T1) extends scala.AnyRef with scala.Product1[T1] with scala.Product with scala.Serializable {
override def toString() : java.lang.String = { /* compiled code */ }
}
可以通过变量名._N 的方式进行访问元组的内容,其中N表示元组中元素的索引号。即通过下标访问记录元素。
//关于隐式类型转化
String类没有toInt方法,而然StringOps有,编译器悄悄的将将String类的实例转换成StringOps对象实例,然后调用toInt方法
Tuple2,表示一对--即两个,Tuple3,表示三个
使用自定义case class对数据进行结构化
case class MatchData(lo: Int,sq: Int)
val codeRDD = HBase_DATARDD.map(
o => {
val age = Bytes.toString(o._2.getValue("info".getBytes, "age".getBytes)).toInt
val code = Bytes.toString(o._2.getValue("info".getBytes, "code".getBytes)).toInt
MatchData(lo,sq)
}
)
功能:创建简单的记录类型,通过有意义的名称来访问记录的元素。
使用系统提供的case class 对数据进行结构化
val codeRDD = HBase_DATARDD.map(
o => {
val age = Bytes.toString(o._2.getValue("info".getBytes, "age".getBytes)).toInt
val code = Bytes.toString(o._2.getValue("info".getBytes, "code".getBytes)).toInt
if (column1 != null && column2 != null) {
Some(column1.toDouble, column2.toDouble)
}else{
None
}
}).filter( o => o != None).map(_.get._1),//过滤后,再使用.get提取其中的一列
//Scala中允许使用_表示匿名函数的参数map(_.get._1) 和map(o => o.get._1) 是一致的
Some、None相关概念的扩展--源代码
//在Spark中的源代码
package scala
case object None extends scala.Option[scala.Nothing] with scala.Product with scala.Serializable {
def isEmpty : scala.Boolean = { /* compiled code */ }
def get : scala.Nothing = { /* compiled code */ }
}
package scala
final case class Some[+A](val x : A) extends scala.Option[A] with scala.Product with scala.Serializable {
def isEmpty : scala.Boolean = { /* compiled code */ }
def get : A = { /* compiled code */ }
}
package scala
sealed abstract class Option[+A]() extends scala.AnyRef with scala.Product with scala.Serializable {
object Option extends scala.AnyRef with scala.Serializable {
//对象序列化
//将实现了Serializable接口的对象转化成一个字节序列,并能够在以后将这个字节序列完全恢复为原来的对象--实现了轻量级持久性
package scala
trait Serializable extends scala.Any with java.io.Serializable {
}
Scala和Java互操作,Scala调用java接口。
package scala
trait Product extends scala.Any with scala.Equals {
def productElement(n : scala.Int) : scala.Any
def productArity : scala.Int
def productIterator : scala.Iterator[scala.Any] = { /* compiled code */ }
def productPrefix : java.lang.String = { /* compiled code */ }
}
package scala
trait Equals extends scala.Any {
def canEqual(that : scala.Any) : scala.Boolean
def equals(that : scala.Any) : scala.Boolean
}
//在Scala中的源代码
final case class Some[+A](x: A) extends Option[A] {
def isEmpty = false
def get = x
}
case object None extends Option[Nothing] {
def isEmpty = true
def get = throw new NoSuchElementException("None.get")
}
Option类型代表任意的值,多用在集合操作中,它可以存储任意类型的值,
Option实例就是Some或者None对象实例,Some和None都是它的子类,他们都是final类,所以不能再有派生子类了
lastOption返回最后一个Option类型对象,lastOption方法中将通过last取到的最后一个元素转换为Some类型了
也就是Option类型只会返回Some或None类型对象
关于 package scala //在Spark中
package object scala extends scala.AnyRef {
type Iterable[+A] = scala.collection.Iterable[A]
val Iterable : scala.collection.Iterable.type = { /* compiled code */ }
type Iterator[+A] = scala.collection.Iterator[A]
val Iterator : scala.collection.Iterator.type = { /* compiled code */ }
type Seq[+A] = scala.collection.Seq[A]
val Seq : scala.collection.Seq.type = { /* compiled code */ }
type List[+A] = scala.collection.immutable.List[A]
val List : scala.collection.immutable.List.type = { /* compiled code */ }
type Vector[+A] = scala.collection.immutable.Vector[A]
val Vector : scala.collection.immutable.Vector.type = { /* compiled code */ }
}