Spark内置支持多种文件格式和数据库。包括JDBC、Hive、Json、ORC、Parquet、MySQL、PostgreSQL。
1、内置数据源
Spark支持的数据格式每个都有各自的优点,对于何时使用何种格式需要结合具体的场景,内置数据源格式为Json、ORC、Parquet
(1)Json
Json格式通常用于web开发,非常常见,简单易用,但是它不是一种有效的永久数据存储格式。
(2)ORC
优化的行列文件格式(ORC)旨在提供一种更有效的方式来存储Hive数据,以前是用于在Hadoop中存储数据的标准格式
(3)Parquet
Parquet在Hadoop生态中更受欢迎,因为它被设计为独立于任何特定的框架,并且没有不必要的依赖。
(4)Postgresql
import org.apache.log4j.{Level, Logger}
import org.apache.spark.sql.SparkSession
object Testsql {
def main(args: Array[String]): Unit = {
Logger.getLogger("org.apache.hadoop").setLevel(Level.WARN)
Logger.getLogger("org.apache.spark").setLevel(Level.INFO)
Logger.getLogger("org.spark_project.jetty").setLevel(Level.WARN)
val spark = SparkSession.builder()
.appName("sparksql")
.master("local")
.getOrCreate()
//useUnicode=true&characterEncoding=UTF-8 编码
//serverTimezone=UTC 时区
val dataDF = spark.read.format("jdbc")
.option("url","jdbc:mysql://localhost:3306/tushu?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC")
.option("dbtable","book")
.option("user","java")
.option("password","123456")
.load()
dataDF.createOrReplaceTempView("tmptable")
val sql = "select * from tmptable where id >= 3"
spark.sql(sql).show()
spark.stop()
}
}
2、保存数据
DataFrame的数据使用DataFrameWriter对象保存
postsDf.write.saveAsTable("posts")
除了saveAsTable方法外,还可以使用save和insertInto方法保存数据。saveAsTable和insertInto将数据保存到Hive表中,并在过程中间使用metastore,save没有该功能。如果没有使用Hive支持的Spark会话,那么saveAsTable和insertInto方法会创建(或插入)临时表。
(1)配置writer
DataFrameWriter实现了构造器模式,这意味着它的配置函数返回具有配置片段的对象,因此可以一个接着一个堆叠它们,构建配置。如下
“format”:指定用于保存数据的文件格式,可以是内置数据源(json、Parquet、ORC),没有指定时,默认是Parquet。
“mode”:指定表或文件已存在时的保存模式。可能是overwrite(覆盖)、append(追加)、ignore(不做任何事)、error(抛出异常)。默认值是error
“option和options”:向数据源配置添加单个参数名称和值(或参数值映射)
“partitionBy”:指定分区列
(2)使用SaveAsTable方法
如果正在使用Hive支持,那么saveAsTable将数据保存到Hive表,并将其注册在Hive metastore中。否则,DataFrame将被注册为临时表。
postsDf.write.format("json").saveAsTable("postsjson")
sql("select * from postsjson")
(3)使用insertInto方法
使用insertInto方法时,需要指定一个已经存在于Hive metastore中的表,并且该表具有与要保存的DataFrame相同的模式,如果模式不一样,则Spark会抛出异常。
(4)使用save方法
save方法不使用Hive metastore,数据会直接保存在文件系统,无论是HDFS,Amazon S3,又或是URL,都会向它传递到达目标的直接路径。
(5)“捷径”
DataFrameWriter有3种方法来将数据保存到内置数据源:json、ORC和Parquet。每个首先会指定相应的格式,然后调用save。
(6)使用JDBC将数据保存到关系型数据库
val props = new java.util.Properties()
props.setProperty("user", "user")
props.setProperty("password", "password")
postsDf.write.jdbc("jdbc:postgresql://postgresrv/mydb", "posts", props)
3、加载数据
使用DataFrameReader对象加载数据,可通过SparkSession的read访问,类似于DataFrameWriter。
与DataFrameWriter的save方法类似,load方法直接从配置的数据源加载数据。三个快捷方式json、orc、parquet。
可以使用table函数从Hive metastore中注册的表中加载DataFrame。
val postsDf = spark.read.table("posts")
val postsDf = spark.table("posts")
(1)使用JDBC从关系数据库加载数据
val result = spark.read.jdbc("jdbc:postgresql://postgresrv/mydb", "posts", Array("viewCount > 3"), props)
(2)从使用SQL注册的数据源中加载数据
注册临时表的另一种方法是让用户使用SQL引用现有的数据源。
sql("CREATE TEMPORARY TABLE postsjdbc "+
"USING org.apache.spark.sql.jdbc "+
"OPTIONS ("+
"url 'jdbc:postgresql://postgresrv/mydb',"+
"dbtable 'posts',"+
"user 'user',"+
"password 'password')")
//------------------------或者是------------------------
sql("CREATE TEMPORARY TABLE postsParquet "+
"USING org.apache.spark.sql.parquet "+
"OPTIONS (path '/path/to/parquet_file')")
val resParq = sql("select * from postsParquet")
Spark SQL 数据操作:DataFrame的保存与加载详解
本文介绍了Spark如何使用DataFrame进行数据的保存和加载,涉及Json、ORC、Parquet等格式,以及saveAsTable、insertInto、save方法的使用,并提到了JDBC连接关系型数据库的操作。
2633

被折叠的 条评论
为什么被折叠?



