1 DataFrame基本介绍
一个dataFrame表示是一个二维的表, 一个二维表, 必然存在 行 列 表结构描述信息
表结构描述信息(元数据): StructType
字段: StructField
定义: 字段的名称, 字段的类型, 字段是否可以为Null
认为: 在一个StructType对象下, 由多个StructField组成的, 构建了一个完整的元数据信息
行: Row对象
列: Column对象
注意: dataFrame本质上就是一个RDD, 只是对RDD进行包装, 在其基础上添加schema元数据信息,从而处理结构化数据
如何构建表结构信息:
2 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/python3'
os.environ['PYSPARK_DRIVER_PYTHON'] = '/root/anaconda3/bin/python3'
if __name__ == '__main__':
print("如何获取DF对象方式一: 通过RDD得到DF对象")
# 1. 创建SparkSession对象
spark = SparkSession.builder.master('local[*]').appName('get_df_01').getOrCreate()
sc = spark.sparkContext
# 2- 构建RDD的数据集
rdd = sc.parallelize(['张三 20', '李四 18', '王五 23'])
# 3. 对数据进行处理操作
# [('张三', '20'), ('李四', '18'), ('王五', '23')]
rdd_map = rdd.map(lambda name_age:(name_age.split()[0],int(name_age.split()[1])))
# 4. 将RDD转换为DF
# 4.1 方案一:
# schema元数据定义方式一:
schema = StructType()\
.add('name', StringType())\
.add('age', IntegerType())
# schema元数据定义方式二:
schema = StructType(fields=[
StructField('name',StringType(),True),
StructField('age',IntegerType(),False)
])
df = spark.createDataFrame(data=rdd_map,schema=schema)
df.printSchema()
df.show()
df = spark.createDataFrame(data=rdd_map,schema='name string,age integer')
df.printSchema()
df.show()
df = spark.createDataFrame(data=rdd_map, schema=['name','age']) # 自动类型推断, 但是一般推断类型比较大
df.printSchema()
df.show()
# 4.2 方案二:
df = rdd_map.toDF(schema=schema)
df.printSchema()
df.show()
df = rdd_map.toDF(schema='name string,age integer')
df.printSchema()
df.show()
df = rdd_map.toDF(schema=['name','age'])
df.printSchema()
df.show()
场景: 当我们数据是半结构化的数据, 或者结构不完整的数据, 此时先通过Spark RDD程序来读取数据集, 将数据集基于RDD的算子完成预处理操作, 将数据转换为结构化的数据, 最后通过Spark SQL来进行最终统计处理操作