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处理过一阵子日志,都是一些零零散散的临时需求,作为一个程序员,饱受查询之苦。在这个使用过程中,也渐渐对spark dataframe的使用摸索出了一些门道。 读写 与RDD的转...
  • dreamer2020
  • dreamer2020
  • 2016年04月30日 22:49
  • 13470

Spark 2.0 DataFrame map操作中Unable to find encoder for type stored in a Dataset.问题的分析与解决

随着新版本的spark已经逐渐稳定,最近拟将原有框架升级到spark 2.0。还是比较兴奋的,特别是SQL的速度真的快了许多。。   然而,在其中一个操作时却卡住了。主要是dataframe.ma...
  • sparkexpert
  • sparkexpert
  • 2016年10月20日 12:17
  • 6392

SparkSQL学习笔记(一)DataFrame

Spark1.5.2版本 简介: DataFrame是分布式数据和数据结构组成的组织集合,概念等同于关系型数据库里的表(dataframe.registerTempTable("tablename")...
  • wsdc0521
  • wsdc0521
  • 2015年11月24日 12:10
  • 5864

sparkSQL:dataframe

DataFrame 的函数 Action 操作 1、 collect() ,返回值是一个数组,返回dataframe集合所有的行 2、 collectAsList() 返回值是一个java类型的数组,...
  • zhonglongshen
  • zhonglongshen
  • 2016年08月31日 16:21
  • 2655

pandas 中Series的map函数

Series的map方法可以接受一个函数或含有映射关系的字典型对象。 (DataFrame中对应的是applymap()函数,当然DataFrame还有apply()函数)import pandas...
  • xiaodongxiexie
  • xiaodongxiexie
  • 2016年11月16日 00:07
  • 6698

Pandas之Dataframe操作

创建一个DataFrame,它有几种创建方式: 列表,序列(pandas.Series), numpy.ndarray的字典二维numpy.ndarray别的DataFrame结构化的记录(st...
  • wang4959520
  • wang4959520
  • 2016年04月07日 17:59
  • 20339

Spark-SQL之DataFrame操作大全

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

spark小技巧-mapPartitions

与map方法类似,map是对rdd中的每一个元素进行操作,而mapPartitions则是对rdd中的每个分区的迭代器进行操作。如果在map过程中需要频繁创建额外的对象(例如将rdd中的数据通过jdb...
  • lsshlsw
  • lsshlsw
  • 2015年09月21日 16:03
  • 20526

spark dataframe API 整理

1,从列表中创建dataframe    列表的每一个元素转换成Row对象,利用parallelize()函数将列表转换成RDD,toDF()函数将RDD转换成dataframe    from py...
  • ZhanYunQI
  • ZhanYunQI
  • 2017年04月27日 14:52
  • 1375

spark的DataFrame介绍及使用示例分析

DataFrame是spark推荐的统一结构化数据接口。 基于DataFrame能实现快速的结构化数据分析。 它让spark具备了大规模结构化数据的处理能力。 暗示了spark希望一统大数据处理...
  • qq_23617681
  • qq_23617681
  • 2016年05月14日 20:10
  • 2844
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Spark RDD/DataFrame map保存数据的两种方式
举报原因:
原因补充:

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