(七) sparkSQL编程指南学习

sparkSQL编程指南学习

1:sparkSQL概述

Spark SQL是用于结构化数据处理的Spark模块。与基本的Spark RDD API不同。与Spark SQL交互的方法有多种,包括SQL和Dataset API。

1.1:Datasets and DataFrames

DataSet是一个由特定域的对象组成的强类型集合,可通过功能或关系操作并行转换其中的对象。 每个Dataset还有一个非类型视图,即由多个列组成的DataSet,称为DataFrame。
DataFrame是一个由多个列组成的结构化的分布式数据集合,等同于关系数据库中的一张表。DataFrame是Spark SQL中的最基本的概念,可以通过多种方式创建,例如结构化的数据集、Hive表、外部数据库或者是RDD。
DataFrame 内部数据无类型,统一为 Row。是一种特殊类型的 Dataset,DataSet[Row] = DataFrame
sparkSQL执行的返回结果包括Datasets and DataFrames两种
下文中df代表DataFrames

dataset	 		java,scala		
dataframes		java,scala,python,R		构建方式:hive,rdd,数据库,结构性数据文件等
1:DataFrames

可以从现有的RDD,Hive表的或Spark数据源创建DataFrame

people.json
// + ---- + ------- + 
// | null | Michael | 
// | 30 | 安迪| 
// | 19 | 贾斯汀| 
// + ---- + ------- +

常见构建方式

1:json		val  df  =  spark .read.json (“ examples / src / main / resources / people.json” )
			//将DataFrame的内容显示到stdout 
			df .show ()
2:数据库val  sqlDF  =  spark 。sql (“ SELECT * FROM people” )
2:Datasets

数据集类似于RDD,但是,它们不使用Java序列化或Kryo,而是使用专用的Encoder对对象进行序列化以进行处理或通过网络传输
创建:通过使用SparkSession上的read函数或者

2:入门

SparkSession类是Spark中所有功能的入口点,是Spark 2.0中的内置支持Hive功能,包括使用HiveQL编写查询,访问Hive UDF以及从Hive表读取数据的功能

//对于隐式转换,例如将RDD转换为DataFrames,代码中
import spark.implicits._

2.1 构建SparkSession

val spark =SparkSession.builder()         //只需要.builder() 即可

2.2 构建数据源

数据源加载包括多种方式,默认加载文件,手动指定数据格式,执行sql加载

  • 1:默认加载
    默认加载文件格式为parquet,通过spark.sql.sources.default指定的格式
val usersDF = spark.read.load("examples/src/main/resources/users.parquet")
  • 2:手动指定数据格式
    数据格式: (json, parquet, jdbc, orc, libsvm, csv, text)
    api: spark.read.format(“数据格式”).load(“filename”)
1:json		val peopleDF = spark.read.format("json").load("examples/src/main/resources/people.json")
2:csv		val peopleDFCsv = spark.read.format("csv")
 	 	.option("sep", ";")
  		.option("inferSchema", "true")
  		.option("header", "true")
  		.load("examples/src/main/resources/people.csv")
  • 3:sql读取:SparkSession可以用于对数据执行SQL查询,将结果返回为DataFrame。
val sqlDF = spark.sql("SELECT * FROM parquet.`examples/src/main/resources/users.parquet`")
  • 4:格式间转换
    json读取的df转为parquet
JsonDF.write.parquet("people.parquet")

2.3 全局临时视图:Global Temporary View

相当于一张临时表,存放在程序中,程序结束自动消失。全局临时视图与系统保留的数据库global_temp相关联,我们必须使用限定名称来引用它,例如SELECT * FROM global_temp.view1。
临时试图:createOrReplaceTempView 和createGlobalTempView

创建视图:df .createGlobalTempView (“ people” )
查询:spark.sql("SELECT * FROM global_temp.people").show()

3:sparkSQL和hive

SparkSession是其统一构建方式。Spark SQL还支持读写存储在Apache Hive中的数据。但是,由于Hive具有大量依赖关系,因此默认的Spark分发中不包含这些依赖关系。如果可以在类路径上找到Hive依赖项,Spark将自动加载它们。请注意,这些Hive依赖项也必须存在于所有工作节点上,因为它们将需要访问Hive序列化和反序列化库(SerDes)才能访问存储在Hive中的数据。

所需配置文件:hive-site.xml,core-site.xml和hdfs-site.xml

使用Hive时,必须实例化SparkSessionHive支持,包括与永久性Hive元存储库的连接,对Hive Serdes的支持以及Hive用户定义的功能。没有现有Hive部署的用户仍可以启用Hive支持

3.1:SparkSession demo

val spark = SparkSession
  .builder()
  .appName("Spark Hive Example")
  .config("spark.sql.warehouse.dir", warehouseLocation)
  .enableHiveSupport()//提供hive相关操作
  .getOrCreate()
//隐式转换导入
import spark.implicits._
import spark.sql

val sql("CREATE TABLE IF NOT EXISTS src (key INT, value STRING) USING hive")
spark.sql(sql).show()
  • 开发maven依赖
<spark.version>2.3.0</spark.version>
<dependency>
 <groupId>org.apache.spark</groupId>
 <artifactId>spark-sql_2.11</artifactId>
 <version>${spark.version}</version>
</dependency>

4:mysql和sparkSQL

Spark SQL还包括一个可以使用JDBC从其他数据库读取数据的数据源,以下为常用指定JDBC连接属性

url			要连接的JDBC URL。特定于源的连接属性可以在URL中指定。例如,jdbc:postgresql://localhost/test?user=fred&password=secret
dbtable		应该读取的JDBC表。请注意,FROM可以使用在SQL查询子句中有效的任何内容。例如,除了完整表之外,您还可以在括号中使用子查询。
driver		用于连接到该URL的JDBC驱动程序的类名。
partitionColumn, lowerBound, upperBound	如果指定了这些选项,则必须全部指定。另外, numPartitions必须指定。它们描述了从多个工作程序并行读取时如何对表进行分区。 partitionColumn必须是相关表格中的数字列。请注意,lowerBound和upperBound仅用于确定分区的步幅,而不是用于过滤表中的行。因此,表中的所有行都将被分区并返回。此选项仅适用于阅读。
numPartitions	表读写中可用于并行处理的最大分区数。这也确定了并发JDBC连接的最大数量。如果要写入的分区数超过了此限制,我们可以通过coalesce(numPartitions)在写入之前进行调用将其减少到此限制。
fetchsize		JDBC的获取大小,它确定每次往返要获取多少行。这可以帮助提高JDBC驱动程序的性能,该驱动程序默认为较小的访存大小(例如10行的Oracle)。此选项仅适用于阅读。
batchsize		JDBC批处理大小,它确定每次往返要插入多少行。这可以帮助提高JDBC驱动程序的性能。此选项仅适用于写作。默认为1000。
isolationLevel	事务隔离级别,适用于当前连接。它可以是一个NONE,READ_COMMITTED,READ_UNCOMMITTED,REPEATABLE_READ,或SERIALIZABLE,对应于由JDBC的连接对象定义,缺省值为标准事务隔离级别READ_UNCOMMITTED。此选项仅适用于写作。请参阅中的文档java.sql.Connection。
sessionInitStatement	在向远程数据库打开每个数据库会话之后,在开始读取数据之前,此选项将执行自定义SQL语句(或PL / SQL块)。使用它来实现会话初始化代码。例:option("sessionInitStatement", """BEGIN execute immediate 'alter session set "_serial_direct_read"=true'; END;""")
truncate				这是与JDBC编写器相关的选项。当SaveMode.Overwrite启用时,该选项的原因星火截断,而不是删除和重建其现有的表。这可以更有效,并防止删除表元数据(例如索引)。但是,在某些情况下(例如,新数据具有不同的架构时),它将不起作用。默认为false。此选项仅适用于写作。

4.1:读取JDBC

val jdbcDF = spark.read
  .format("jdbc")
  .option("url", "jdbc:postgresql:dbserver")
  .option("dbtable", "schema.tablename")
  .option("user", "username")
  .option("password", "password")
  .load()

4.2:写入JDBC

jdbcDF.write
  .format("jdbc")
  .option("url", "jdbc:postgresql:dbserver")
  .option("dbtable", "schema.tablename")
  .option("user", "username")
  .option("password", "password")
  .save()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值