Spark RDD/DataFrame map保存数据的两种方式

原创 2017年10月06日 11:55:15

使用Spark RDD或DataFrame,有时需要在foreachPartition或foreachWith里面保存数据到本地或HDFS。

直接保存数据

当然如果不需要在map里面保存数据,那么针对RDD可以有如下方式

val rdd = // target rdd
rdd.saveAsHadoopFile // add some parameters 

针对DataFrame可以有如下方式保存数据

val df = // target dataframe
// 保存中间数据
df.registerTempTable("temp table name")

// 持久化数据
df.save // 使用save函数,指定模式等参数
df.saveAsParquetFile    // depressed
df.saveAsTable  // depressed

foreach里面保存数据

调用foreachXXX之后,里面的每条记录都是Iterator[YYY]形式的数据,是可迭代数据。

保存到文件

保存到文件相对简单,可以直接使用上面的save保存,例如

def save2HDFS(sc: SparkContext, input: Iterator[Row]): Unit = {
    val result = input.map(item => item.getString(0) + "," + item.getInt(1)).toSeq
    val tmpRDD = sc.parallelize(result)
    tmpRDD.saveAsObjectFile("//path") // 1
    tmpRDD.saveAsTextFile("//path") // 2
    tmpRDD.saveAsTextFile("",CompressClass) // 3 内容编码类,继承自org.apache.hadoop.io.compress.CompressionCodec
  }

保存到数据库

在foreachXXX里面,可以将数据保存到数据库,这里使用的方式为JDBC的方式。

 def save2DB(input: Iterator[Row]): Unit = {

    var temp: Row = null
    while (input.hasNext) {
      temp = input.next // 将迭代数据保存为入库数据
    }

    var dbconn: Connection = null
    var stmt: Statement = null
    try {
      dbconn = DriverManager.getConnection("", "", "")
      stmt = dbconn.createStatement()
      stmt.execute("truncate table TableName")
    } catch {
      case e: Exception => {
        // println(">>>>>>>>>>>>清空表失败")
        // e.printStackTrace()
      }
    } finally {
      { // close connection
        if (stmt != null)
          stmt.close()
        if (dbconn != null)
          dbconn.close()
      }
      { // modify poiner to NULL
        stmt = null
        dbconn = null
      }
    }
  }

DataFrame读入写出操作

DataFrame可以方便的将要各种数据源的数据,读入到内存中,也可以方便的将DF数据写为各种格式的数据。

读入操作

sqlContext.read.jdbc// JDBC数据源
sqlContext.read.json// JSON数据源
sqlContext.read.parquet// Parquet数据源

写出操作

val tarDF =  // target dataframe 
tarDF.write.jdbc// 写入JDBC数据库
tarDF.write.json// 写入JSON数据源
tarDF.write.parquet// 写入Parquet数据源

以上几种数据源,是Spark自身带有驱动程序的。其他文件格式,需要相应的驱动程序,或相应的安装包支持。

版权声明:本文为博主原创文章,未经博主允许不得转载。

spark dataframe操作集锦(提取前几行,合并,入库等)

spark dataframe派生于RDD类,但是提供了非常强大的数据操作功能。当然主要对类SQL的支持。 在实际工作中会遇到这样的情况,主要是会进行两个数据集的筛选、合并,重新入库。 ...

Spark-SQL之DataFrame操作大全

Spark SQL中的DataFrame类似于一张关系型数据表。在关系型数据库中对单表或进行的查询操作,在DataFrame中都可以通过调用其API接口来实现。可以参考,Scala提供的DataFra...
  • dabokele
  • dabokele
  • 2016年10月12日 23:31
  • 36133

Spark DataFrames入门指南:创建和操作DataFrame

一、从csv文件创建DataFrame   本文将介绍如何从csv文件创建DataFrame。 如何做?   从csv文件创建DataFrame主要包括以下几步骤:   1、在build....
  • LW_GHY
  • LW_GHY
  • 2016年05月23日 11:56
  • 36822

spark DataFrame用法

最近用spark处理过一阵子日志,都是一些零零散散的临时需求,作为一个程序员,饱受查询之苦。在这个使用过程中,也渐渐对spark dataframe的使用摸索出了一些门道。 读写 与RDD的转...

spark点滴之map-flatMap~mappartition~sortBY~fold~combinebykey~分区~mvn~scala

map 和 flatMap: 通过一个实验来看Spark 中 map 与 flatMap 的区别。 步骤一:将测试数据放到hdfs上面 hadoopdfs -put data1/test...

spark操作parquet文件

spark1.2.0操作parquet文件,其他版本请查阅官方api 写: import os,sys from pyspark import SparkConf,SparkContext f...

Spark 2.1 -- spark SQL , Dataframe 和DataSet 指南

Overview SQLDatasets and DataFrames Getting Started Starting Point: SparkSessionCreating Data...

如何应对SparkSQL DataFrame保存到hdfs时出现的过多小文件问题

原因就不解释了,总之是因为多线程并行往hdfs写造成的(因为每个DataFrame/RDD分成若干个Partition,这些partition可以被并行处理)。 其结果就是一个存下来的文件,其实是h...

如何应对SparkSQL DataFrame保存到hdfs时出现的过多小文件问题

原因就不解释了,总之是因为多线程并行往hdfs写造成的(因为每个DataFrame/RDD分成若干个Partition,这些partition可以被并行处理)。 其结果就是一个存下来的文件,其实是h...

spark中flatMap函数用法--spark学习(基础)

说明在spark中map函数和flatMap函数是两个比较常用的函数。其中 map:对集合中每个元素进行操作。 flatMap:对集合中每个元素进行操作然后再扁平化。 理解扁平化可以举个简单例子...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Spark RDD/DataFrame map保存数据的两种方式
举报原因:
原因补充:

(最多只允许输入30个字)