Spark/Scala - 读取 RcFile && OrcFile

简介: ​上文提到了MapReduce - 读取 OrcFile, RcFile 文件,这里通过 Java + MapReduce 实现了读取 RcFile 和 OrcFile 文件,后续又遇到MapReduce - 同时读取 RcFile 和 OrcFile 的依赖冲突,也顺利解决,但是平常开发还是习惯 spark 所以改用 spark 实现读取 OrcFile 和 RcFile 以及 Map-Reduce 的功能。......

一.引言

上文提到了 MapReduce - 读取 OrcFile, RcFile 文件,这里通过 Java + MapReduce 实现了读取 RcFile 和 OrcFile 文件,后续又遇到 MapReduce - 同时读取 RcFile 和 OrcFile 的依赖冲突,也顺利解决,但是平常开发还是习惯 spark 所以改用 spark 实现读取 OrcFile 和 RcFile 以及 Map-Reduce 的功能。

二.读取 RcFile

image.gif编辑

前面 mr 的任务我们已经对 RcFile 的形式有了了解,其 key 的形式不关键,LongWritable 是行号, NullWritable 就是忽略行号,主要是 value 的形式: BytesRefArrayWritable,所以可以使用 spark 的 hadoopFile API 实现 RcFile 的读取,先看下 hadoopFile 的参数:

def hadoopFile[K, V](
      path: String,
      inputFormatClass: Class[_ <: InputFormat[K, V]],
      keyClass: Class[K],
      valueClass: Class[V],
      minPartitions: Int = defaultMinPartitions): RDD[(K, V)]

image.gif

keyClass 和 ValueClass 上面已经确定,inputFormat 也好确定,根据 MR - MultipleInputs.addInputPath 可以得知其 inputFormatClass 为 RCFileInputFormat,下面开始读取:

val conf = (new SparkConf).setAppName("TestReadRcFile").setMaster("local[1]")
    val spark = SparkSession
      .builder
      .config(conf)
      .getOrCreate()
    val sc = spark.sparkContext
    val rcFileInput = “”
    val minPartitions = 100
    println(repeatString("=", 30) + "开始读取 RcFile" + repeatString("=", 30))
    val rcFileRdd = sc.hadoopFile(rcFileInput, classOf[org.apache.hadoop.hive.ql.io.RCFileInputFormat[LongWritable, BytesRefArrayWritable]], classOf[LongWritable], classOf[BytesRefArrayWritable], minPartitions)
      .map(line => {
        val key = LazyBinaryRCFileUtils.readString(line._2.get(0))
        val value = LazyBinaryRCFileUtils.readString(line._2.get(1))
        (key, value)
      })
    println(repeatString("=", 30) + "结束读取 RcFile" + repeatString("=", 30))

image.gif

image.gif编辑

Tips:

readString 函数:

public static String readString(BytesRefWritable v) throws IOException {
    Text txt = new Text();
    txt.set(v.getData(), v.getStart(), v.getLength());
    return txt.toString();
  }

image.gif

三.读取 OrcFile

相比于读取 RcFile 需要用 hadoopFile,因为 SparkSession 提供了直接读取 orcFile 的 API,使得 spark 读取 OrcFile 相当的丝滑,注意这里 orc 读取后返回的是 DataSet,需要通过 .rdd 转化为 Spark 的常规 RDD。

val conf = (new SparkConf).setAppName("TestReadRcFile").setMaster("local[1]")
    val spark = SparkSession
      .builder
      .config(conf)
      .getOrCreate()
    println(repeatString("=", 30) + "开始读取 OrcFile" + repeatString("=", 30))
    import spark.implicits._
    val orcInput = “”
    val orcFileRdd = spark.read.orc(orcInput).map(row => {
       val key = row.getString(0)
       val value = row.getString(1)
      (key, value)
    }).rdd
    println(repeatString("=", 30) + "结束读取 OrcFile" + repeatString("=", 30))

image.gif

image.gif编辑

四.spark 实现 Map-Reduce

上述 rcFileRdd 和 orcFileRdd 两个 PairRdd 可以看作是两个 Mapper,下面执行 reduce 操作,通过 union 实现各个 pairRdd 的合并,随后执行 groupByKey 对目标 key 进行 value 聚合,随后执行 reduce 的操作即可:

rcFileRdd.union(orcFileRdd).groupByKey().map(info => {
      val key: String = info._1
      val values: Iterable[String] = info._2
        ... reduce func ...
    })

image.gif

五.总结

相比于 MR 读取 RcFile 与 OrcFile,spark 的 API 还是相对简洁一些,有需要的小伙伴可以尝试,肥肠的奈斯~

目录
相关文章
|
分布式计算 大数据 Java
大数据-87 Spark 集群 案例学习 Spark Scala 案例 手写计算圆周率、计算共同好友
大数据-87 Spark 集群 案例学习 Spark Scala 案例 手写计算圆周率、计算共同好友
313 5
|
分布式计算 关系型数据库 MySQL
大数据-88 Spark 集群 案例学习 Spark Scala 案例 SuperWordCount 计算结果数据写入MySQL
大数据-88 Spark 集群 案例学习 Spark Scala 案例 SuperWordCount 计算结果数据写入MySQL
240 3
|
消息中间件 分布式计算 NoSQL
大数据-104 Spark Streaming Kafka Offset Scala实现Redis管理Offset并更新
大数据-104 Spark Streaming Kafka Offset Scala实现Redis管理Offset并更新
400 0
|
消息中间件 存储 分布式计算
大数据-103 Spark Streaming Kafka Offset管理详解 Scala自定义Offset
大数据-103 Spark Streaming Kafka Offset管理详解 Scala自定义Offset
497 0
|
SQL 分布式计算 Java
大数据-96 Spark 集群 SparkSQL Scala编写SQL操作SparkSQL的数据源:JSON、CSV、JDBC、Hive
大数据-96 Spark 集群 SparkSQL Scala编写SQL操作SparkSQL的数据源:JSON、CSV、JDBC、Hive
484 0
|
缓存 分布式计算 大数据
大数据-90 Spark 集群 RDD 编程-高阶 RDD容错机制、RDD的分区、自定义分区器(Scala编写)、RDD创建方式(一)
大数据-90 Spark 集群 RDD 编程-高阶 RDD容错机制、RDD的分区、自定义分区器(Scala编写)、RDD创建方式(一)
376 0
|
分布式计算 算法 大数据
大数据-90 Spark 集群 RDD 编程-高阶 RDD容错机制、RDD的分区、自定义分区器(Scala编写)、RDD创建方式(二)
大数据-90 Spark 集群 RDD 编程-高阶 RDD容错机制、RDD的分区、自定义分区器(Scala编写)、RDD创建方式(二)
357 0
|
人工智能 分布式计算 大数据
大数据≠大样本:基于Spark的特征降维实战(提升10倍训练效率)
本文探讨了大数据场景下降维的核心问题与解决方案,重点分析了“维度灾难”对模型性能的影响及特征冗余的陷阱。通过数学证明与实际案例,揭示高维空间中样本稀疏性问题,并提出基于Spark的分布式降维技术选型与优化策略。文章详细展示了PCA在亿级用户画像中的应用,包括数据准备、核心实现与效果评估,同时深入探讨了协方差矩阵计算与特征值分解的并行优化方法。此外,还介绍了动态维度调整、非线性特征处理及降维与其他AI技术的协同效应,为生产环境提供了最佳实践指南。最终总结出降维的本质与工程实践原则,展望未来发展方向。
697 0
|
分布式计算 大数据 Apache
ClickHouse与大数据生态集成:Spark & Flink 实战
【10月更文挑战第26天】在当今这个数据爆炸的时代,能够高效地处理和分析海量数据成为了企业和组织提升竞争力的关键。作为一款高性能的列式数据库系统,ClickHouse 在大数据分析领域展现出了卓越的能力。然而,为了充分利用ClickHouse的优势,将其与现有的大数据处理框架(如Apache Spark和Apache Flink)进行集成变得尤为重要。本文将从我个人的角度出发,探讨如何通过这些技术的结合,实现对大规模数据的实时处理和分析。
1256 2
ClickHouse与大数据生态集成:Spark & Flink 实战
|
存储 分布式计算 Hadoop
从“笨重大象”到“敏捷火花”:Hadoop与Spark的大数据技术进化之路
从“笨重大象”到“敏捷火花”:Hadoop与Spark的大数据技术进化之路
790 79