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. (1)、hive框架搭建和架构简介

    一.简介 Hive是基于hadoop的一个数据仓库工具,有助于查询和管理分布式存储系统中的数据集,非常适合数据仓库的统计分析 Hive 不适合用于连机事物处理.也不提供实时查询,比较适合在大量不可变数 ...

  2. Spring MVC multipart/form-data Controller 400

    问题很简单是解析器定义问题 SpringMVC默认解析器 <bean id="multipartResolver" class="org.springframewo ...

  3. Linux 系统时间设置

    from:https://blog.csdn.net/yjh314/article/details/51669238 今早看到一台机器时间对不上,本以为系统时间与网络北京时间不同步,就在终端命令执行网 ...

  4. iOS-tableView会卡顿

    其实影响tableView卡顿的因素有很多,我也就其中一些常见的问题来说一下. 在tableView里的tableViewCell中使用许多图片的时候,而且我们大量使用的是 xxx.clipsToBo ...

  5. 深入java虚拟机(一) 虚拟机内存结构

    java虚拟机所管理的内存区域(运行时数据区)主要分为如下几个部分:堆(heap).方法区(method area).虚拟机栈(VM stack).本地方法栈(native method stack) ...

  6. 涨姿势UWP源码——IsolatedStorage

    前一篇涨姿势UWP源码分析从数据源着手,解释了RSS feed的获取和解析,本篇则会就数据源的保存和读取进行举例. 和之前的Windows Runtime一样,UWP采用IsolatedStorage ...

  7. 【BZOJ4896】[Thu Summer Camp2016]补退选 Trie树

    [BZOJ4896][Thu Summer Camp2016]补退选 Description X是T大的一名老师,每年他都要教授许多学生基础的C++知识.在T大,每个学生在每学期的开学前都需要选课,每 ...

  8. [LintCode] 两个排序数组的中位数

    class Solution { public: /** * @param A: An integer array. * @param B: An integer array. * @return: ...

  9. eslint Rules

    Rules 为了让你对规则有个更好的理解,ESLint 对其进行了分门别类. 所有的规则默认都是禁用的.在配置文件中,使用 "extends": "eslint:reco ...

  10. 巨蟒python全栈开发数据库攻略4:多表操作&Navicat&pymysql

    1.多表查询 2.连表补充 3.boss工具=>Navicat 4.索引加速寻找工具=>everything 5.pymysql 6.pymysql初识 7.pymysql的各个方法