【大数据分析】Spark SQL查询: DataFrame的保存与加载

本文介绍了Spark如何使用DataFrame进行数据的保存和加载,涉及Json、ORC、Parquet等格式,以及saveAsTable、insertInto、save方法的使用,并提到了JDBC连接关系型数据库的操作。

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")

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值