Spark学习:如何创建DataFrame?

如何创建DataFrame

  • 一、从RBDMS(关系型数据库)创建DataFrame
  • 二、从Driver端创建DataFrame
  • 三、从csv文件中创建DataFrame
  • 四、从Parquet/ORC创建DataFrame

一、从RBDMS(关系型数据库)创建DataFrame

1、spark安装目录没有提供与数据库连接相关的Jar包,因此,对于想访问的数据库,需要把相关的Jar包拷贝到SPARK_HOME的Jars文件夹,在此贴上我的配置
spark:3.1.2
oracle:Personal Oracle Database 11g Release 11.2.0.1.0 - 64bit Production
jar:ojdbc6.jar
2、使用spark的read API读取数据库,通过参数指定数据库驱动、数据库地址、用户名、密码等关键信息
eg:以Oracle数据库为例
spark.read.format(“jdbc”)
.option(“driver”, “oracle.jdbc.driver.OracleDriver”)
.option(“url”, “jdbc:oracle:thin:@localhost:1521:orcl”)
.option(“user”, “用户名”)
.option(“password”,“密码”)
.option(“numPartitions”, 20)
.option(“dbtable”, "数据表名 ")
.load()

import org.apache.spark.sql.DataFrame
val dfOralce:DataFrame = spark.read.format("jdbc").option("driver", "oracle.jdbc.driver.OracleDriver").option("url", "jdbc:oracle:thin:@10.10.189.180:1521:orcl").option("user", "scott").option("password","scott").option("numPartitions", 20).option("dbtable", "EMP").load()
dfOracle.show

然后展示如下图所示
Spark学习:如何创建DataFrame?_第1张图片
3、对oracle数据库进行简单操作
1)使用Spark Sql算子

val filterdfOracle:DataFrame = dfOracle.filter("SAL" >= "10000").select("ENAME","JOB")
filterdfOracle.show

结果如下图所示
Spark学习:如何创建DataFrame?_第2张图片
2)使用sql语句

dfOracle.createTempView("t")
val query:String = "select t.ename,t.job from t where t.sal >= 1000"
val result:DataFrame = spark.sql(query)
result.show

展示的结果和第一种通过spark sql算子的一样

二、从Driver端创建DataFrame

1、createDataFrame方法(复杂)

import org.apache.spark.rdd.RDD
val seq[(String,Int)] = Seq(("hu",20),("nian",22))
//创建RDD
val rdd:RDD[(String,Int)] = sc.parallelize(seq)
//给RDD封装一层schema
import org.apache.spark..sql.types.{StringType,IntegerType,StructType,StructField}
val schema:StructType = StructType(Array(StructField(StringType,"name"),StructField(IntegerType,"age")))
//把RDD类型转换为RDD[Row]
import org.apache.spark.sql.Row
val rddRow:RDD[Row] = rdd.map(fields => Row(fields._1,fields._2))
//调用createDataFrame方法
import org.apache.spark.sql.DataFrame
val dataframe:DataFrame = spark.createDataFrame(rddRow,schema)
dataframe.show

Spark学习:如何创建DataFrame?_第3张图片
2、toDF方法(简单)

//导入spark.implicits._包
import spark.implicits._
val dataframe:DataFrame = seq.toDF("name","age")
dataframe.show

三、从csv文件中创建DataFrame

加载选项 可选值 默认值 含义
header true/false False csv文件的第一行,是否为Data Schema
seq 任意字符 ,(逗号) 数据列之间的分隔符
escape 任意字符 \ (反斜杠) 转义字符
nullValue 任意字符 “”(空字符串) 声明文件中的空值
dateFormat SimpleDateFormat字符串 yyyy-mm-dd 声明日期格式
mode permissive、dropMalformed、failFast permissive 读取模式

1、header表示是否使用文件中的第一行作为列名,如果选了false,则使用“_c”来命名每一个数据列,如"_c0","_c1"等
eg:

vim test.csv
name,age
li,10
shi,20
ming,30
import org.apache.spark.sql.DataFrame
val csvdf:DataFrame = spark.read.format("csv").option("header",true).option("seq",",").load("/root/test.csv")
csvdf.show

在这里插入图片描述
可以看到name和age都为string类型
注意!!!:对于加载的每一列数据,不论数据本身的含义是什么,spark都会将它视为String类型
要想在加载的过程中,为DataFrame的每一列指定数据类型,需要显式的定义Data Schema,并在read API中调用schema方法,来将schema传递给DataFrame
eg:

import org.apache.spark.sql.DataFrame
import org.apache.spark.sql.types.{StringType,IntegerType,StructType,StructField}
val schema:StructType = StructType(Array(StructField("name",StringType),StructField("age",IntegerType)))
val csvdf:DataFrame = spark.read.format("csv").schema(schema).option("header",true).load("/root/test.csv")
csvdf.show

在这里插入图片描述
可以看到age为Int类型了
2、seq表示分隔列数据的分隔符
3、escape指定文件中的转义符
4、nullValue指定文件中的空值
5、dateFormat指定文件中的日期格式
6、mode指明spark如何对待csv文件中的脏数据(如数据类型错误,字段类型为Integer,出现8.5、‘8’等小数或字符串),如下表所示,

mode取值 含义
permissive 容忍度最高:遇到脏数据,将脏数据转化为null
dropMalformed 次之:遇到脏数据跳过加载,不让它进入待创建的DataFrame
failFast 没商量:遇到脏数据立即报错并退出,创建dataFrame失败

四、从Parquet/ORC创建DataFrame

相比从csv创建DataFrame,从Parquet/Orc创建DataFrame就比较简单,只需指定文件类型和文件路径即可

import org.apache.spark.sql.DataFrame
//parquet
val df:DataFraem = spark.read.format("parquet").load("文件路径")
val df:DataFrame = spark.read.parquet("文件路径")
//orc
val df:DataFrame = spark.read.format("orc").load("文件路径")

当然,spark还支持多种文件格式上创建DataFrame,如text、json、xml等,都是通过read API指定文件格式和文件路径创建,这里就不一一列举了,大家可以访问官网提供的列表

你可能感兴趣的:(Spark,spark,big,data,数据库)