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