dataframe转化为array_疯狂Spark之DataFrame创建方式详解二(十)

bfb0041f3dae9a550e0ddcfb625ebba4.png

创建DataFrame的几种方式

1、读取parquet文件创建DataFrame

注意:

可以将DataFrame存储成parquet文件。保存成parquet文件的方式有两种

df.write().mode(SaveMode.Overwrite).format("parquet").save("./sparksql/parquet");
df.write().mode(SaveMode.Overwrite).parquet("./sparksql/parquet");

SaveMode指定文件保存时的模式,参数解释如下。

Overwrite:覆盖

Append:追加

ErrorIfExists:如果存在就报错

Ignore:如果存在就忽略

代码演示

方式一:使用format方法

package com.gw.sparksql
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.sql.SQLContext
import org.apache.spark.sql.SaveMode
object Parquet {
 def main(args: Array[String]): Unit = {
 val conf = new SparkConf().setMaster("local").setAppName("parquet")
 val sc = new SparkContext(conf)
 val sqlContext = new SQLContext(sc)
    //读取json文件,读取出来的文件是RDD形式
 val jsonRDD = sc.textFile("sparksql/json")
    //将RDD转换成DataFrame形式
 val df = sqlContext.read.json(jsonRDD)
    //将DF保存为parquet文件
    df.write.mode(SaveMode.Overwrite).format("parquet").save("./sparksql/parquet")
    //读取parquet文件
 var result = sqlContext.read.parquet("./sparksql/parquet")
    result.show()
    sc.stop()
  }
}

运行结果

90004e991177c8e97eeb9f90ea8a162e.png

此时刷新项目,在项目的sparksql目录下会多出一个目录,如下图

014482609bc9d068d55c84b3f05385ed.png

方式二:使用parquet方法

package com.gw.sparksql
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.sql.SQLContext
import org.apache.spark.sql.SaveMode
object Parquet {
 def main(args: Array[String]): Unit = {
 val conf = new SparkConf().setMaster("local").setAppName("parquet")
 val sc = new SparkContext(conf)
 val sqlContext = new SQLContext(sc)
    //读取json文件,读取出来的文件是RDD形式
 val jsonRDD = sc.textFile("sparksql/json")
    //将RDD转换成DataFrame形式
 val df = sqlContext.read.json(jsonRDD)
    //将DF保存为parquet文件
     df.write.mode(SaveMode.Overwrite).parquet("./sparksql/parquet")
    //读取parquet文件
 var result = sqlContext.read.format("parquet").load("./sparksql/parquet")
    result.show()
    sc.stop()
  }
}

2、读取JDBC中的数据创建DataFrame(MySql为例)

在mysql数据库中新建一个库:spark,在该库中新建两张数据表:score,person

创建库语句:create database spark default charset utf8;

使用数据库:use spark

创建数据库表语句

create table score(
    id int primary key auto_increment,
    name varchar(20),
    score int
)engine=innodb default charset utf8;
create table person(
    id int primary key auto_increment,
    name varchar(20),
    age int
    )engine=innodb default charset utf8;

添加信息

insert into score values (1,'张三',98);

insert into score values (2,'李四',78);

insert into score values (3,'王五',68);

insert into score values (4,'赵六',88);

f832dadebe35dae92c88d6b1bcda831d.png

insert into person values (1,'张三',23);

insert into person values (2,'李四',33);

insert into person values (3,'王五',25);

insert into person values (4,'赵六',26);

51dd30b345f06a593dc1402dd7f03a04.png

在项目中添加连接数据库的jar包

8f4c81a2fc5662f2b8ab047be43e44c6.png

代码演示

需求:连接数据库,读取数据库中数据

方式一:

package com.gw.sparksql
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.sql.SQLContext
import java.util.HashMap
object Mysql {
 def main(args: Array[String]): Unit = {
 val conf = new SparkConf().setMaster("local").setAppName("mysql")
 val sc = new SparkContext(conf)
 val sqlContext = new SQLContext(sc)
 	  //第一种方式读取Mysql数据库表创建DF
    //获取数据库连接信息
 val options = new HashMap[String,String]();
		options.put("url", "jdbc:mysql://localhost:3306/spark")
		options.put("driver","com.mysql.jdbc.Driver")
		options.put("user","root")
		options.put("password", "root")
		options.put("dbtable","person")
 val person = sqlContext.read.format("jdbc").options(options).load()
		person.show()
  }
}

运行结果

7a609ce5f6293d84fa623be41638f6eb.png

方式二:

package com.gw.sparksql
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.sql.SQLContext
object Mysql {
 def main(args: Array[String]): Unit = {
 val conf = new SparkConf().setMaster("local").setAppName("mysql")
 val sc = new SparkContext(conf)
 val sqlContext = new SQLContext(sc)
 	  //第二种方式读取Mysql数据库表创建DF
    //获取数据库连接信息
 val reader = sqlContext.read.format("jdbc")
		reader.option("url", "jdbc:mysql://localhost:3306/spark")
		reader.option("driver","com.mysql.jdbc.Driver")
		reader.option("user","root")
		reader.option("password","root")
		reader.option("dbtable", "score")
 val score = reader.load()
		score.show()
  }
}

运行结果

011e57b266c0800ab05dd54d4cc88f7a.png

两张表连接查询

package com.gw.sparksql
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.sql.SQLContext
import java.util.HashMap
object Mysql {
 def main(args: Array[String]): Unit = {
 val conf = new SparkConf().setMaster("local").setAppName("mysql")
 val sc = new SparkContext(conf)
 val sqlContext = new SQLContext(sc)
 	  /**
		 * 第一种方式读取Mysql数据库表创建DF
		 */
 val options = new HashMap[String,String]();
		options.put("url", "jdbc:mysql://localhost:3306/spark")
		options.put("driver","com.mysql.jdbc.Driver")
		options.put("user","root")
		options.put("password", "root")
		options.put("dbtable","person")
 val person = sqlContext.read.format("jdbc").options(options).load()
		person.registerTempTable("person")
		/**
		 * 第二种方式读取Mysql数据库表创建DF
		 */
 val reader = sqlContext.read.format("jdbc")
		reader.option("url", "jdbc:mysql://localhost:3306/spark")
		reader.option("driver","com.mysql.jdbc.Driver")
		reader.option("user","root")
		reader.option("password","root")
		reader.option("dbtable", "score")
 val score = reader.load()
		score.registerTempTable("score")
		//连接查询
 val result = sqlContext.sql("select person.id,person.age,score.name,score.score from person,score where person.name = score.name")
		result.show()
  }
}

运行结果

f6d5478b27e4ef000ee59cfb061be75a.png

向数据库中添加数据

需求:将查询出来的数据添加到一张result表中

package com.gw.sparksql
import java.util.HashMap
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.sql.SQLContext
import org.apache.spark.sql.SaveMode
import java.util.Properties
object Mysql {
 def main(args: Array[String]): Unit = {
 val conf = new SparkConf().setMaster("local").setAppName("mysql")
 val sc = new SparkContext(conf)
 val sqlContext = new SQLContext(sc)
 	  /**
		 * 第一种方式读取Mysql数据库表创建DF
		 */
 val options = new HashMap[String,String]();
		options.put("url", "jdbc:mysql://localhost:3306/spark")
		options.put("driver","com.mysql.jdbc.Driver")
		options.put("user","root")
		options.put("password", "root")
		options.put("dbtable","person")
 val person = sqlContext.read.format("jdbc").options(options).load()
		person.registerTempTable("person")
		/**
		 * 第二种方式读取Mysql数据库表创建DF
		 */
 val reader = sqlContext.read.format("jdbc")
		reader.option("url", "jdbc:mysql://localhost:3306/spark")
		reader.option("driver","com.mysql.jdbc.Driver")
		reader.option("user","root")
		reader.option("password","root")
		reader.option("dbtable", "score")
 val score = reader.load()
		score.registerTempTable("score")
		//连接查询
 val result = sqlContext.sql("select person.id,person.age,score.name,score.score from person,score where person.name = score.name")
		result.show()
		/**
		 * 将数据写入到Mysql表中
		 */
 val properties = new Properties()
		properties.setProperty("user", "root")
		properties.setProperty("password", "root")
		result.write.mode(SaveMode.Append).jdbc("jdbc:mysql://localhost:3306/spark", "result", properties)
		sc.stop()
  }
}

此时在数据库中查询,发现多出一张result表,表中存储的是刚刚连接查询出来的数据

df72ce9397213b5464c17d25e937373e.png

3、读取Hive中的数据加载成DataFrame

HiveContext是SQLContext的子类,连接Hive建议使用HiveContext。

由于本地没有Hive环境,要提交到集群运行,提交命令:

./spark-submit  --master spark://node01:7077,node02:7077 
--executor-cores 1  --executor-memory 2G  --total-executor-cores 1
--class com.gw.sparksql.dataframe.CreateDFFromHive  /root/test/HiveTest.jar

代码演示

package com.gw.sparksql
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.sql.hive.HiveContext
import org.apache.hadoop.hive.conf.HiveConf
import org.apache.spark.sql.SaveMode
object Hive {
 def main(args: Array[String]): Unit = {
 val conf = new SparkConf().setAppName("HiveSource")
 val sc = new SparkContext(conf)
    /**
     * HiveContext是SQLContext的子类。
     */
 val hiveContext = new HiveContext(sc)
    hiveContext.sql("use spark")
    hiveContext.sql("drop table if exists student_infos")
    hiveContext.sql("create table if not exists student_infos (name string,age int) row format  delimited fields terminated by 't'")
    hiveContext.sql("load data local inpath '/root/test/student_infos' into table student_infos")
 
    hiveContext.sql("drop table if exists student_scores")
    hiveContext.sql("create table if not exists student_scores (name string,score int) row format delimited fields terminated by 't'")
    hiveContext.sql("load data local inpath '/root/test/student_scores' into table student_scores")
 
 val df = hiveContext.sql("select si.name,si.age,ss.score from student_infos si,student_scores ss where si.name = ss.name")
    hiveContext.sql("drop table if exists good_student_infos")
    /**
     * 将结果写入到hive表中
     */
    df.write.mode(SaveMode.Overwrite).saveAsTable("good_student_infos")
    sc.stop()
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值