Pyspark_SQL1

Pyspark

注:大家觉得博客好的话,别忘了点赞收藏呀,本人每周都会更新关于人工智能和大数据相关的内容,内容多为原创,Python Java Scala SQL 代码,CV NLP 推荐系统等,Spark Flink Kafka Hbase Hive Flume等等~写的都是纯干货,各种顶会的论文解读,一起进步。
今天继续和大家分享一下Pyspark_SQL1
#博学谷IT学习技术支持


`


前言

比起Spark RDD,工作中更常用的是Spark SQL。我平时自己离线任务写的最多的也是Spark SQL,重要程度不言而喻。
在这里插入图片描述
虽然Spark SQL底层也是Spark RDD,但是进行自动优化。效率会较高。官方主推的也是Spark SQL。


一、Spark SQL的数据结构对比

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。
说明:
pandas的df: 二维表, 处理单机化数据
Spark Core:处理任何的数据结构, 处理大规模的分布式数据
Spark SQL: 二维表, 处理大规模的分布式数据

在这里插入图片描述
RDD: 存储直接就是对象, 比如在图中, 存储就是一个Person的对象, 但是里面有什么数据靠内心, 不太清楚

DataFrame: 将Person中各个字段的数据, 进行格式化存储,形成一个dataFrame,可以直接看到数据

dataSet: 将Person对象中数据都按照结构化的方式存储好, 同时保留对象的类型,从而知道来源于一个Person的对象

由于Python不支持泛型,所以无法使用DataSet类型, 客户端仅支持dataFrame类型

二、Spark SQL的入门案例

数据集:
1,张三,男,北京
2,李四,女,上海
3,王五,女,北京
4,赵六,男,广州
5,田七,男,北京
6,周八,女,杭州

需求: 有如下结构化数据, 要求查询在北京地区的学员有那些?

from pyspark import SparkContext, SparkConf
import os

from pyspark.sql import SparkSession

if __name__ == '__main__':
    print("Spark init")
    spark = SparkSession.builder.appName("Spark Sql init").master("local[*]").getOrCreate()

    df = spark.read.csv(
        path="file:///export/data/workspace/ky06_pyspark/_03_SparkSql/data/a.txt",
        header=True,
        inferSchema=True,
        sep=",",
        encoding="UTF-8"
    )

    df.printSchema()
    df.show()

    # 方法一
    df.createOrReplaceTempView("df_temp")
    df_res = spark.sql("""
        select * from df_temp where address = '北京'
    """)

    # 方法二
    df_res = df.where("address = '北京'")

    df_res.show()
    spark.stop()

三、DataFrame详解

3.1 DataFrame基本介绍

在这里插入图片描述
一个dataFrame表示是一个二维的表, 一个二维表, 必然存在 行 列 表结构描述信息

表结构描述信息(元数据): StructType
字段: StructField
定义: 字段的名称, 字段的类型, 字段是否可以为Null

认为: 在一个StructType对象下, 由多个StructField组成的, 构建了一个完整的元数据信息
行: Row对象
列: Column对象
注意: dataFrame本质上就是一个RDD, 只是对RDD进行包装, 在其基础上添加schema元数据信息,从而处理结构化数据
在这里插入图片描述

3.2 DataFrame的构建方式

方式一: 通过RDD得到一个dataFrame

from pyspark import SparkContext, SparkConf
from pyspark.sql import SparkSession
from pyspark.sql.types import *

if __name__ == '__main__':
    print("Spark Rdd Df")

    spark = SparkSession.builder.appName("Spark Rdd Df").master("local[*]").getOrCreate()
    sc = spark.sparkContext

    rdd_init = sc.parallelize(['zhangsan 20', 'lisi 18', 'wangwu 23'])
    rdd_map = rdd_init.map(lambda line: (line.split()[0], int(line.split()[1])))

    schema = StructType().add("name", StringType(), True).add("age", IntegerType(), True)

    # schema = StructType(
    #     fields=[
    #         StructField("name", StringType(), True),
    #         StructField("age", IntegerType(), True)
    #     ]
    # )

    df = spark.createDataFrame(data=rdd_map, schema=schema)
    df.printSchema()
    df.show()

    spark.stop()

方式二: 如何将Pandas的DF转换为Spark SQL的DF对象

from pyspark import SparkContext, SparkConf
import os
import pandas as pd

from pyspark.sql import SparkSession
from pyspark.sql.types import *

if __name__ == '__main__':
    print("pandas df to Spark df")

    spark = SparkSession.builder.appName("pandas df to Spark df").master("local[*]").getOrCreate()
    pd_df = pd.DataFrame({
    
    
        "id": [1, 2, 3, 4],
        "name": ["zhangsan", "lisi", "wangwu", "zhaoliu"],
        "address": ["beijing", "shanghai", "shenzhen", "guangzhou"]
    })

    schema = StructType().add("id", IntegerType(), False).add("name", StringType(), False).add("address", StringType(),
                                                                                               False)
    spark_df = spark.createDataFrame(data=pd_df, schema=schema)
    spark_df.printSchema()
    spark_df.show()

    spark.stop()

方式三: 内部初始化数据的方式, 来直接得到一个DF对象

from pyspark import SparkContext, SparkConf

from pyspark.sql import SparkSession
from pyspark.sql.types import *

if __name__ == '__main__':
    print("create spark df")

    spark = SparkSession.builder.appName("create spark df").master("local[*]").getOrCreate()
    schema = StructType().add("id", IntegerType(), False).add("name", StringType(), False).add("address", StringType(),
                                                                                               False)
    df = spark.createDataFrame(
        data=[(1, "zhangsan", "beijing"),
              (2, "lisi", "shanghai"),
              (3, "wangwu", "guangzhou")],
        schema=schema
    )
    df.printSchema()
    df.show()

    spark.stop()

方式四: 通过读取外部txt文件的方式, 获取DF对象

from pyspark import SparkContext, SparkConf

from pyspark.sql import SparkSession
from pyspark.sql.types import *

if __name__ == '__main__':
    print("read text")

    spark = SparkSession.builder.appName("read text").master("local[*]").getOrCreate()
    schema = StructType().add("dept", StringType(), False)
    
    df = spark.read \
        .format("text") \
        .schema(schema=schema) \
        .load("file:///export/data/workspace/ky06_pyspark/_03_SparkSql/data/dept.txt")

    df.printSchema()
    df.show()

    spark.stop()

方式五: 通过读取外部csv文件的方式, 获取DF对象

from pyspark import SparkContext, SparkConf

from pyspark.sql import SparkSession
from pyspark.sql.types import *

if __name__ == '__main__':
    print("read csv")

    spark = SparkSession.builder.appName("read csv").master("local[*]").getOrCreate()
    schema = StructType().add("id", IntegerType(), False).add("dept", StringType(), False)
    
    df = spark.read \
        .format("csv") \
        .option("sep", " ") \
        .option("header", True) \
        .option("encoding", "utf-8") \
        .schema(schema=schema) \
        .load("file:///export/data/workspace/ky06_pyspark/_03_SparkSql/data/dept.txt")

    df.printSchema()
    df.show()

    spark.stop()

方式六: 通过读取外部json文件的方式, 获取DF对象

from pyspark import SparkContext, SparkConf

from pyspark.sql import SparkSession
from pyspark.sql.types import *

if __name__ == '__main__':
    print("read json")

    spark = SparkSession.builder.appName("read json").master("local[*]").getOrCreate()
    schema = StructType().add("id", IntegerType(), False).add("name", StringType(), False) \
        .add("age", IntegerType(), False).add("address", StringType(), True)
    df = spark.read \
        .format("json") \
        .schema(schema=schema) \
        .load("file:///export/data/workspace/ky06_pyspark/_03_SparkSql/data/stu.json")

    df.printSchema()
    df.show()

    spark.stop()


总结

今天主要和大家分享了Pyspark_SQL基础概念和入门案例。

猜你喜欢

转载自blog.csdn.net/weixin_53280379/article/details/129749251