1. SparkSQL和 Hive同样,都是用于大规模SQL分布式计算的计算框架,均可以运行在YARN本上,在企业中广泛被应用
2. SparkSQL的数据抽象为:SchemaRDD(废弃)、DataFrame (Python、R、Java、Scala ) .DataSet (Java、scala)。
3. DataFrame同样是分布式数据集,有分区可以并行计算,和RDD不同的是,DataFrame中存储的数据结构是以表格形式组织的,方便进行SQL计算
4. DataFrame对比DataSet基本相同,不同的是DataSet支持泛型特性,可以让Java、Scala语言更好的利用到。
5. SparkSession是2.0后退出的新执行环境入口对象,可以用于RDD、SQL等编程
helloword:
数据源:stu_score.txt
1,语文,99
2,语文,99
3,语文,99
4,语文,99
5,语文,99
6,语文,99
7,语文,99
8,语文,99
9,语文,99
10,语文,99
11,语文,99
12,语文,99
13,语文,99
14,语文,99
15,语文,99
16,语文,99
17,语文,99
18,语文,99
19,语文,99
20,语文,99
21,语文,99
22,语文,99
23,语文,99
24,语文,99
25,语文,99
26,语文,99
27,语文,99
28,语文,99
29,语文,99
30,语文,99
1,数学,96
2,数学,96
3,数学,96
4,数学,96
5,数学,96
6,数学,96
7,数学,96
8,数学,96
9,数学,96
10,数学,96
11,数学,96
12,数学,96
13,数学,96
14,数学,96
15,数学,96
16,数学,96
17,数学,96
18,数学,96
19,数学,96
20,数学,96
21,数学,96
22,数学,96
23,数学,96
24,数学,96
25,数学,96
26,数学,96
27,数学,96
28,数学,96
29,数学,96
30,数学,96
1,英语,99
2,英语,99
3,英语,99
4,英语,99
5,英语,99
6,英语,99
7,英语,99
8,英语,99
9,英语,99
10,英语,99
11,英语,99
12,英语,99
13,英语,99
14,英语,99
15,英语,99
16,英语,99
17,英语,99
18,英语,99
19,英语,99
20,英语,99
33,英语,99
22,英语,99
23,英语,99
24,英语,99
25,英语,99
26,英语,99
27,英语,99
28,英语,99
29,英语,99
30,英语,99
# coding:utf8
# SparkSession对象的导包, 对象是来自于 pyspark.sql包中
from pyspark.sql import SparkSession
if __name__ == '__main__':
# 构建SparkSession执行环境入口对象
spark = SparkSession.builder.\
appName("test").\
master("local[*]").\
getOrCreate()
# 通过SparkSession对象 获取 SparkContext对象
sc = spark.sparkContext
# SparkSQL的HelloWorld
df = spark.read.csv("../data/input/stu_score.txt", sep=',', header=False)
df2 = df.toDF("id", "name", "score")
df2.printSchema()
df2.show()
df2.createTempView("score")
# SQL 风格
spark.sql("""
SELECT * FROM score WHERE name='语文' LIMIT 5
""").show()
# DSL 风格
df2.where("name='语文'").limit(5).show()
DataFrame对象构建
基于RDD方式1:
# coding:utf8
# SparkSession对象的导包, 对象是来自于 pyspark.sql包中
from pyspark.sql import SparkSession
if __name__ == '__main__':
# 构建SparkSession执行环境入口对象
spark = SparkSession.builder.appName("test").master("local[*]").getOrCreate()
sc=spark.sparkContext
rdd=sc.textFile("../data/input/sql/people.txt").map(lambda x:x.split(",")).map(lambda x:(x[0],int(x[1])))
df=spark.createDataFrame(rdd,schema=['name','age'])
df.printSchema()
df.show(20,False)
df.createTempView("people")
spark.sql("select * from people where age<30").show()
基于RDD方式2:
# coding:utf8
from pyspark.sql import SparkSession
from pyspark.sql.types import StructType, StringType, IntegerType
if __name__ == '__main__':
# 0. 构建执行环境入口对象SparkSession
spark = SparkSession.builder.appName("test").master("local[*]").getOrCreate()
sc = spark.sparkContext
# 基于RDD转换成DataFrame
rdd = sc.textFile("../data/input/sql/people.txt").map(lambda x: x.split(",")).map(lambda x: (x[0], int(x[1])))
# 构建表结构的描述对象: StructType对象
schema = StructType().add("name", StringType(), nullable=True).\
add("age", IntegerType(), nullable=False)
# 基于StructType对象去构建RDD到DF的转换
df = spark.createDataFrame(rdd, schema=schema)
df.printSchema()
df.show()
基于RDD方式3:
# coding:utf8
from pyspark.sql import SparkSession
from pyspark.sql.types import StructType, StringType, IntegerType
if __name__ == '__main__':
# 0. 构建执行环境入口对象SparkSession
spark = SparkSession.builder.\
appName("test").\
master("local[*]").\
getOrCreate()
sc = spark.sparkContext
# 基于RDD转换成DataFrame
rdd = sc.textFile("../data/input/sql/people.txt").\
map(lambda x: x.split(",")).\
map(lambda x: (x[0], int(x[1])))
# toDF的方式构建DataFrame
df1 = rdd.toDF(["name", "age"])
df1.printSchema()
df1.show()
# toDF的方式2 通过StructType来构建
schema = StructType().add("name", StringType(), nullable=True).\
add("age", IntegerType(), nullable=False)
df2 = rdd.toDF(schema=schema)
df2.printSchema()
df2.show()
基于Pandas的DateFrame转变为DataFrame对象:
# coding:utf8
from pyspark.sql import SparkSession
from pyspark.sql.types import StructType, StringType, IntegerType
import pandas as pd
if __name__ == '__main__':
# 0. 构建执行环境入口对象SparkSession
spark = SparkSession.builder.\
appName("test").\
master("local[*]").\
getOrCreate()
sc = spark.sparkContext
# 基于Pandas的DataFrame构建SparkSQL的DataFrame对象
pdf = pd.DataFrame(
{
"id": [1, 2, 3],
"name": ["张大仙", "王晓晓", "吕不为"],
"age": [11, 21, 11]
}
)
df = spark.createDataFrame(pdf)
df.printSchema()
df.show()
基于API读取外部数据:
# coding:utf8
from pyspark.sql import SparkSession
from pyspark.sql.types import StructType, StringType, IntegerType
if __name__ == '__main__':
# 0. 构建执行环境入口对象SparkSession
spark = SparkSession.builder.appName("test").master("local[*]").getOrCreate()
sc = spark.sparkContext
schema1=StructType().add("data",StringType(),nullable=True)
df1=spark.read.format("text").schema(schema=schema1).load("../data/input/sql/people.txt")
df1.printSchema()
df1.show()
df2=spark.read.format("json").load("../data/input/sql/people.json")
df2.show()
df3=spark.read.format("csv").option("sep",";").option("header",True).option("encoding","utf-8").\
schema("name STRING,age INT,job STRING").load("../data/input/sql/people.csv")
df3.show()
df4=spark.read.format("parquet").load("../data/input/sql/users.parquet")
df4.show()
1. DataFrame在结构层面上由StructField组成列描述,由StructType构造表描述。在数据层面上,Column对象记录列数据,Row对象记录行数据
2.DataFrame可以从RDD转换、Pandas DF转换、读取文件、读取JDBC等方法构建
3. spark.read.format()和df.write.format()是DataFrame读取和写出的统一化标准API
4. SparkSQL默认在Shuffle阶段200个分区,可以修改参数获得最好性能
5. dropDuplicates可以去重、dropna可以删除缺失值、fillna可以填充缺失值
6. SparkSQL支持JDBC读写,可用标准API对数据库进行读写操作