Spark文件的读取与保存

  • Spark读取的文件格式:Text文件,Json文件,Csv文件,Sequence文件,Object文件
  • Spark读取的文件系统:本地文件系统、HDFS、Hbase、数据库

平时用的比较多的是:从HDFS读取,保存Text文件

一、读取Text文件

val rdd1 = sc.textFile("./words.txt")

rdd1.saveAsTextFile("hdfs://hadoop201:9000/words_output")

二、读取Json文件

  • SparkSQL处理Json很方便。而使用RDD读取Json读取会很复杂。

三、读取sequence文件

SequenceFile文件是Hadoop用来存储二进制形式的key-value对儿 而设计的一种平面文件。

Spark有专门读取SequenceFile的接口,在SparkContext中,可以调用 sequenceFile[keyClass, valueClass](path)

  • 注意:SequenceFile文件只针对PairRDD
sc.sequenceFile[String,int]("path")

四、从Mysql读取文件

// mysql依赖
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.27</version>
</dependency>
  •  读mysql
val sparkConf: SparkConf = new SparkConf().setAppName("haha").setMaster("local[*]")
        val sc = new SparkContext(sparkConf)

        val driver = "com.mysql.jdbc.Driver"
        val url = "jdbc:mysql://hadoop201:3306/rdd"
        val userName = "root"
        val passwd = "000000"
        val sql = "select id, name from user where id >= ? and id <= ?"

        val rddrest = new JdbcRDD(
            sc,
            () => {
                Class.forName(driver)
                DriverManager.getConnection(url)
            },
            sql,
            1,    // 此处的1是sql语句中的第一个 ? 占位符的数值
            3,    // 此处的3是sql语句中的第二个 ? 占位符数值
            3,    // 查询语句在几个分区中执行,作用是避免在每个 Executor 中都查询所有的语句
            (res) => {    // 回调函数
                println(res.getInt(1) + "," + res.getString(2))
            }
        )
        rddrest.collect()
  • 写Mysql
val sparkConf: SparkConf = new SparkConf().setAppName("haha").setMaster("local[*]")
        val sc = new SparkContext(sparkConf)

        val driver = "com.mysql.jdbc.Driver"
        val url = "jdbc:mysql://hadoop201:3306/rdd"
        val userName = "root"
        val passwd = "000000"

        val rdd: RDD[(Int, String, Int)] = sc.makeRDD(Array((1,"a",10),(2,"b",20),(3,"c",30)))

        rdd.foreachPartition(datas=>{
            // 每个分区生成一个jdbc连接
            Class.forName(driver)
            val conn: Connection = DriverManager.getConnection(url,userName,passwd)
            val statement: PreparedStatement = conn.prepareStatement("insert into user values(?,?,?)")

            datas.foreach(data=>{   // 此处的foreach不是RDD的算子,而是datas集合的方法,所以不会发生序列化异常
                statement.setInt(1,data._1)
                statement.setString(2,data._2)
                statement.setInt(3,data._3)
                statement.executeUpdate()
            })
            statement.close()
            conn.close()
        })
    }

五、读写Hbase

<dependency>
    <groupId>org.apache.hbase</groupId>
    <artifactId>hbase-server</artifactId>
    <version>1.3.1</version>
</dependency>

<dependency>
    <groupId>org.apache.hbase</groupId>
    <artifactId>hbase-client</artifactId>
    <version>1.3.1</version>
</dependency>
  • 读Hbase
  • 写Hbase

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值