dataFrame的构建方式

179 阅读6分钟

「这是我参与11月更文挑战的第15天,活动详情查看:2021最后一次更文挑战

RDD的checkpoint检查点

dataFrame的构建方式

  • 方式一: 将RDD对象转换为dataFrame对象:
from pyspark import SparkContext, SparkConf
from pyspark.sql import SparkSession
from pyspark.sql.types import *
import os

# 目的: 锁定远端操作环境, 避免存在多个版本环境的问题
os.environ["SPARK_HOME"] = "/export/server/spark"
os.environ["PYSPARK_PYTHON"] = "/root/anaconda3/bin/python"
os.environ["PYSPARK_DRIVER_PYTHON"] = "/root/anaconda3/bin/python"

if __name__ == '__main__':
    print("获取dataFrame对象的方式一:  通过RDD转换为dataFrame对象")

    # 1) 创建 sparkSession对象:
    spark = SparkSession.builder.master("local[*]").appName("_01_dataFrame").getOrCreate()

    #2) 获取 sparkContext对象:
    sc = spark.sparkContext

    # 3) 基于 sparkContext 获取一个RDD对象, 并对数据进行相关处理
    rdd_dataset = sc.parallelize([("张三", 20), ("李四", 30), ("王五", 16), ("赵六", 18), ("田七", 22)])

    rdd_filter = rdd_dataset.filter(lambda tuple: tuple[1] > 20)


    #4) 如何将 rdd_filter 对象 转换为 dataFrame对象:
    # 4.1: 定义DF的表结构信息:
    # 说明: 这些类都需要导入的: from pyspark.sql.types import *
    schema = StructType().add("name", StringType(), False).add("age", IntegerType(), False)

    #4.2: 通过spark对象创建DF对象
    df = spark.createDataFrame(data=rdd_filter, schema=schema)


    # 5. 打印schema信息 以及数据内容
    df.printSchema()

    df.show()

  • RDD转换为DF的对象方式二:
from pyspark import SparkContext, SparkConf
from pyspark.sql import SparkSession
from pyspark.sql.types import *
import os

# 目的: 锁定远端操作环境, 避免存在多个版本环境的问题
os.environ["SPARK_HOME"] = "/export/server/spark"
os.environ["PYSPARK_PYTHON"] = "/root/anaconda3/bin/python"
os.environ["PYSPARK_DRIVER_PYTHON"] = "/root/anaconda3/bin/python"

if __name__ == '__main__':
    print("获取dataFrame对象的方式一:  通过RDD转换为dataFrame对象")

    # 1) 创建 sparkSession对象:
    spark = SparkSession.builder.master("local[*]").appName("_01_dataFrame").getOrCreate()

    #2) 获取 sparkContext对象:
    sc = spark.sparkContext

    # 3) 基于 sparkContext 获取一个RDD对象, 并对数据进行相关处理
    rdd_dataset = sc.parallelize([("张三", 20), ("李四", 30), ("王五", 16), ("赵六", 18), ("田七", 22)])

    rdd_filter = rdd_dataset.filter(lambda tuple: tuple[1] > 20)


    #4) 如何将 rdd_filter 对象 转换为 dataFrame对象: 
    # 说明: 通过这种直接指定有哪些列的方案, createDataFrame在转换为DF的时候, 会自动识别数据的类型(自动推测)
    df = spark.createDataFrame(data=rdd_filter, schema=['name','age'])


    # 5. 打印schema信息 以及数据内容
    df.printSchema()

    df.show()

  • RDD转换为DF的对象方式三:
from pyspark import SparkContext, SparkConf
from pyspark.sql import SparkSession
from pyspark.sql.types import *
import os

# 目的: 锁定远端操作环境, 避免存在多个版本环境的问题
os.environ["SPARK_HOME"] = "/export/server/spark"
os.environ["PYSPARK_PYTHON"] = "/root/anaconda3/bin/python"
os.environ["PYSPARK_DRIVER_PYTHON"] = "/root/anaconda3/bin/python"

if __name__ == '__main__':
    print("获取dataFrame对象的方式一:  通过RDD转换为dataFrame对象")

    # 1) 创建 sparkSession对象:
    spark = SparkSession.builder.master("local[*]").appName("_01_dataFrame").getOrCreate()

    #2) 获取 sparkContext对象:
    sc = spark.sparkContext

    # 3) 基于 sparkContext 获取一个RDD对象, 并对数据进行相关处理
    rdd_dataset = sc.parallelize([("张三", 20), ("李四", 30), ("王五", 16), ("赵六", 18), ("田七", 22)])

    rdd_filter = rdd_dataset.filter(lambda tuple: tuple[1] > 20)


    #4) 如何将 rdd_filter 对象 转换为 dataFrame对象:
    # 4.1: 定义DF的表结构信息:
    schema = StructType().add("name", StringType(), False).add("age", IntegerType(), False)

    #4.2: 通过spark对象创建DF对象

    #df = rdd_filter.toDF(['name', 'age'])
    df = rdd_filter.toDF(schema)

    # 5. 打印schema信息 以及数据内容
    df.printSchema()

    df.show()

​ 以上这两种方式, 我们后续很多时候会使用sparkCore来完成数据清洗过滤操作(因为sparkCore可以处理任意数据结构),将其转换为结构化的数据, 然后数据交给sparkSql进行, 此时就需要将RDD转换为dataFrame对象操作


  • 将 pandas的DF对象 转换为 spark SQL的DF对象
from pyspark import SparkContext, SparkConf
from pyspark.sql import SparkSession
import os
import pandas as pd

# 目的: 锁定远端操作环境, 避免存在多个版本环境的问题
os.environ["SPARK_HOME"] = "/export/server/spark"
os.environ["PYSPARK_PYTHON"] = "/root/anaconda3/bin/python"
os.environ["PYSPARK_DRIVER_PYTHON"] = "/root/anaconda3/bin/python"

if __name__ == '__main__':
    print("将pandas的DF转换为 spark SQL DF对象")

    #1) 创建sparkSession对象
    spark = SparkSession.builder.master("local[*]").appName("_04_dataFrame").getOrCreate()

    #2) 构建pandas对象:
    pd_df = pd.DataFrame({"id": [1, 2, 3], "name": ['张三', '李四', '王五'], "address": ['北京', '上海', '深圳']})

    #3) 如何将pandas的DF对象转换为 spark Sql的DF对象呢
    df = spark.createDataFrame(pd_df)

    #4) 打印schema信息以及表数据
    df.printSchema()

    df.show()

通过读取外部数据源的方式, 直接得到一个DF对象:

  • 通过 text方式(format('text'))来读取一个普通文本数据
    • 注意: text方式读取, 仅支持一列数据, 其中表中每一行数据就是文件中每一行数据
from pyspark import SparkContext, SparkConf
from pyspark.sql import SparkSession
from pyspark.sql.types import *
import os
import pandas as pd

# 目的: 锁定远端操作环境, 避免存在多个版本环境的问题
os.environ["SPARK_HOME"] = "/export/server/spark"
os.environ["PYSPARK_PYTHON"] = "/root/anaconda3/bin/python"
os.environ["PYSPARK_DRIVER_PYTHON"] = "/root/anaconda3/bin/python"

if __name__ == '__main__':
    print("读取外部数据源: 通过text方式来读取文本数据")

    #1) 创建sparkSession对象
    spark = SparkSession.builder.master("local[*]").appName("_04_dataFrame").getOrCreate()

    # 2) 读取 stu.txt文本数据
    schema = StructType()\
         .add("line",StringType(),False)

    df = spark.read.format('text').schema(schema=schema).load(
        "file:///export/data/workspace/_03_pyspark_sql/data/stu.txt")

    # 3. 打印schema信息, 以及数据
    df.printSchema()
    df.show()
    
结果为:
+----------------+
|            line(默认名字为 value)|
+----------------+
|s01 张三 30 北京|
|s02 李四 20 上海|
|s03 王五 23 广州|
|s04 赵六 28 北京|
|s05 田七 18 大同|
+----------------+
  • 通过CSV方案 读取文本数据
from pyspark import SparkContext, SparkConf
from pyspark.sql import SparkSession
from pyspark.sql.types import *
import os
import pandas as pd

# 目的: 锁定远端操作环境, 避免存在多个版本环境的问题
os.environ["SPARK_HOME"] = "/export/server/spark"
os.environ["PYSPARK_PYTHON"] = "/root/anaconda3/bin/python"
os.environ["PYSPARK_DRIVER_PYTHON"] = "/root/anaconda3/bin/python"

if __name__ == '__main__':
    print("读取外部数据源: 通过text方式来读取文本数据")

    #1) 创建sparkSession对象
    spark = SparkSession.builder.master("local[*]").appName("_04_dataFrame").getOrCreate()

    # 2) 读取 stu.txt文本数据
	# 定义表结构信息: (列名, 列类型, 是否可以为空)
    schema = StructType()\
        .add("id",StringType(),False)\
        .add("name",StringType(),False)\
        .add("age",IntegerType(),True)\
        .add("address",StringType(),False)
	# 说明: header 表示 文件数据是否有头信息
	#  	   sep : 表示 字段与字段之间的分隔符号
    df = spark.read.format("csv")\
        .option("header",True)\
        .option("sep",' ')\
        .schema(schema=schema)\
        .load("file:///export/data/workspace/_03_pyspark_sql/data/stu.txt")

    # 3. 打印schema信息, 以及数据
    df.printSchema()
    df.show()

  • 通过JSON方式来读取数据操作:
from pyspark import SparkContext, SparkConf
from pyspark.sql import SparkSession
from pyspark.sql.types import *
import os
import pandas as pd

# 目的: 锁定远端操作环境, 避免存在多个版本环境的问题
os.environ["SPARK_HOME"] = "/export/server/spark"
os.environ["PYSPARK_PYTHON"] = "/root/anaconda3/bin/python"
os.environ["PYSPARK_DRIVER_PYTHON"] = "/root/anaconda3/bin/python"

if __name__ == '__main__':
    print("读取外部数据源: 通过Json方式来读取文本数据")

    #1) 创建sparkSession对象
    spark = SparkSession.builder.master("local[*]").appName("_04_dataFrame").getOrCreate()

    # 2) 读取 stu.txt文本数据
    schema = StructType().add("name",StringType(),True).add("age",IntegerType(),True)
    df = spark.read.format("json")\
        .schema(schema=schema)\
        .load("file:///export/data/workspace/_03_pyspark_sql/data/people.xxxx")

    # 3. 打印schema信息, 以及数据
    df.printSchema()
    df.show()

总结说明:

上述关于读取外部数据源的方式,都是一种完整的写法方案, 每一种数据类型, 都有一个简写操作:
	比如: text文本
		spark.read.text(paths="路径",lineSep="行分隔符号, 默认为回车符")
		text支持的选项:
			def text(self, paths, wholetext=False, lineSep=None, pathGlobFilter=None,
             recursiveFileLookup=None, modifiedBefore=None,
             modifiedAfter=None)
             
             lineSep:定义每一行的分隔符号  默认是回车符号
     
     比如: csv方案
     	spark.read.csv(path="路径",[schema="表结构信息",sep="字段分隔符号",encoding="编码设置",header="是否有头信息"])
     	
     	全部选项:
     		csv(self, path, schema=None, sep=None, encoding=None, quote=None, escape=None,
            comment=None, header=None, inferSchema=None, ignoreLeadingWhiteSpace=None,
            ignoreTrailingWhiteSpace=None, nullValue=None, nanValue=None, positiveInf=None,
            negativeInf=None, dateFormat=None, timestampFormat=None, maxColumns=None,
            maxCharsPerColumn=None, maxMalformedLogPerPartition=None, mode=None,
            columnNameOfCorruptRecord=None, multiLine=None, charToEscapeQuoteEscaping=None,
            samplingRatio=None, enforceSchema=None, emptyValue=None, locale=None, lineSep=None,
            pathGlobFilter=None, recursiveFileLookup=None, modifiedBefore=None, modifiedAfter=None,
            unescapedQuoteHandling=None)