package com.fuge.bigdata.datahub.analysis

 import java.io.{DataInput, DataOutput}

 import com.fuge.bigdata.tools.common.utils.SparkUtils
import org.apache.hadoop.io.{NullWritable, WritableComparable}
import org.apache.spark.SparkContext /**
* Created by chen xiang on 18-6-13.
* 一个使用SequenceFile进行存储读取的使用示例
*/
object SequenceFileUsage {
def main(args: Array[String]): Unit = { require(args.length == 1)
// 构建SparkContext对象,封装过,单独运行,自行修改后定义
val sc = new SparkContext(SparkUtils.getSparkConf("SequenceFileUsage")) // 获取路径参数
val path = args(0).trim // 定义测试数据
val studentList = List(Student("01", "abc"), Student("02", "baby"), Student("03", "xiang")) // 序列化测试数据到RDD,并写入到bos
sc.parallelize(studentList)
.repartition(1)
// 以NullWritable 为key,构建kv结构.SequenceFile需要kv结构才能存储,NullWritable不占存储
.map(NullWritable.get() -> _)
// 压缩参数可选用
.saveAsSequenceFile(s"$path", Option(classOf[GzipCodec])) // 读取刚才写入的数据
val studentRdd = sc.sequenceFile(s"$path/part-*", classOf[NullWritable], classOf[Student])
.map {
// 读取数据,并且重新赋值对象
case (_, y) => Student(y.id, y.name)
}
.persist() studentRdd
.foreach(x => println("count: " + x.id + "\t" + x.name))
}
} case class Student(var id: String, var name: String) extends WritableComparable[Student] {
/**
* 重写无参构造函数,用于反序列化时的反射操作
*/
def this() {
this("", "")
} /**
* 继承Comparable接口需要实现的方法,用于比较两个对象的大小
*/
override def compareTo(o: Student): Int = {
var cmp = id compareTo o.id
if (cmp == 0) {
cmp = name compareTo o.name
}
cmp
} /**
* 继承Writable接口需要实现的方法-反序列化读取结果,并且赋值到对象字段
* 注意要和write的顺序一致
*/
override def readFields(in: DataInput): Unit = {
name = in.readUTF()
id = in.readUTF()
println("count: " + "\t id = " + id + "\t name = " + name)
} /**
* 继承Writable接口需要实现的方法-序列化写操作,将对象字段值写入序列化
* 注意要和readFields的顺序一致
*/
override def write(out: DataOutput): Unit = {
out.writeUTF(id)
out.writeUTF(name)
}
}
补充:
1. 自定义的类需要进行序列化,必须都要实现Writable,一般情况下采用实现WritableComparable的方式,并且实现comparaTo,readFields, write方法,并且提供一个无参构造函数
2. readFields和write方法,里面字段的顺序要保持一致
3. 遇到集合类型,序列化时需要先将集合长度写进去,然后再挨个写集合数据
4. 遇到集合类型,反序列化时需要先读取集合的长度,然后接收数据,如果集合数据类型是自定义类型,还需要先实例化一个无参构造,然后赋值。
5. SequenceFile需要使用KV结构才能调用存储,可以使用一个NullWritable来占位,上诉例子中的K值就是使用的NullWritable进行的
6. sequenceFile序列化后占用的存储空间比较大,有需要的话,可以在存储的时候加上压缩算法,具体使用方式可以见上诉的例子

Spark 实现自定义对象sequenceFile方式存储,读写示例(scala编写)的更多相关文章

  1. JS 创建自定义对象的方式方法

    一.概述 还记得刚开始做项目的时候,看到别人封装的js工具类百思不得其解,看来看去看不懂,深挖一下,其实就是自己没有耐下心去看,但是遇到问题不解决,总会遇到的,今天还是遇到了,就去找了找帖子,重新思考 ...

  2. javascrip自定义对象的方式

    对象初始化方式(也叫json对象创建方式) <script type="text/javascript"> var User = { name:"paul&q ...

  3. Java基础知识强化之集合框架笔记40:Set集合之HashSet存储自定义对象并遍历

    1. HashSet存储自定义对象并遍历 2. 代码示例: (1)Student类,如下: package cn.itcast_02; /** * @author Administrator * */ ...

  4. Java基础知识强化之集合框架笔记24:ArrayList存储自定义对象并遍历

    1. ArrayList存储自定义对象并遍历 2. 代码示例: Student.java,如下: package cn.itcast_01; public class Student { privat ...

  5. iOS开发——UI进阶篇(十一)应用沙盒,归档,解档,偏好设置,plist存储,NSData,自定义对象归档解档

    1.iOS应用数据存储的常用方式XML属性列表(plist)归档Preference(偏好设置)NSKeyedArchiver归档(NSCoding)SQLite3 Core Data 2.应用沙盒每 ...

  6. 在配置文件(.settings、.config)中存储自定义对象

    原文:在配置文件(.settings..config)中存储自定义对象 引言 我前面曾写过一篇<使用配置文件(.settings..config)存储应用程序配置>,我在其中指出“sett ...

  7. NSUserDefaults 简介,使用 NSUserDefaults 存储自定义对象

    摘要: NSUserDefaults适合存储轻量级的本地数据,一些简单的数据(NSString类型的)例如密码,网址等,NSUserDefaults肯定是首选,但是如果我们自定义了一个对象,对象保存的 ...

  8. java 16 -11 ArrayList存储自定义对象并增强for遍历

    需求:ArrayList存储自定义对象并遍历.要求加入泛型,并用增强for遍历. A:迭代器 B:普通for     C:增强for LinkedList,Vector,Colleciton,List ...

  9. ios存储 plist 偏好设置 自定义对象存储

    1,plist Plist注意:不能存储自定义对象 Plist:数组和字典,  如何判断一个对象能不能使用Plist,就看下有没有writeToFile 获取应用的文件夹(应用沙盒) NSString ...

随机推荐

  1. 用MathType编辑反三角函数的方法

    在使用文档写数学类的文章时候,常常会涉及到一些数学公式,由于数学公式中包含了很多的数学符号,如果使用文档自带的公式编辑器往往会发现很多的符号都不全或者不符合自己的要求.这个时候就需要一款专业的数学公式 ...

  2. 图像增强:直方图均衡和小波变换【matlab】

    直方图均衡:统计图像像素灰度的直方图分布.对其进行重新分配以使图像的直方图分布更加均衡. 小波变换:图像轮廓主要体现在低频部分,可以通过对低频分解系数进行增强处理,对高频分解系数进行衰减处理,达到图像 ...

  3. MD5文件校验

    经常看到在网上下载个什么东西,旁边经常会跟一个md5值,以前不太清楚是做什么的.今天偶然发现了一个liunux命令 md5sum.经查寻知道这个命令是用来生成或校验md5值的命令.还是刚才的问题,为什 ...

  4. python bottle学习(二)加载配置文件

    from bottle import (run, route, get, post, default_app, Bottle) """ 首先获得一个app对象,有两种方法 ...

  5. storyboard设置navigation controller

    到storyboard选中我们唯一一个的viewcontroller,找到xcode的菜单栏,Edit->Embed In->NavigationController.这时候storybo ...

  6. quartz定时任务配置

    参考:http://www.cnblogs.com/kay/archive/2007/11/02/947372.html Quartz是一个强大的企业级任务调度框架,Spring中继承并简化了Quar ...

  7. cocos2d-X学习之主要类介绍:布景:CCLayer

    类继承图:  CCLayer 是CCNode的子类 ,实现了TouchEventsDelegate接口,继承了CCNode所有的特性,并且附加了一些自己的特性,它能够接收iPhone的触摸事件,也能够 ...

  8. 160805、oracle查询:取出每组中的第一条记录

    在Java 9发布之前,我们来分享一些Java 8开发技巧 [以下为译文] 在使用JAVA 8进行开发多年后,结合个人使用IntelliJ IDEA的心得,我总结了以下几个JAVA8技巧供大家参考. ...

  9. VB 十六进制转汉字的函数

    Public Function HexToStr(ByVal strs As String) As String Dim i As Integer, tmp As String, n If Len(s ...

  10. mongoose连接数据库的两种形式

    不废话,直接 ---------------------- .如果你的应用程序只使用一个数据库, 应该使用 mongoose.connect. 如果您需要创建额外的连接,使用 mongoose.cre ...