SparkSQL学习

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对数据库进行读写操作

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值