学习的DateFrame的组成以及创建
DataFrame是一个二维表结构,那么表格结构就有无法绕开的三个点: 1.行 2.列 3.表结构描述
比如,在MySQL中的一张表:
1.由许多行组成
2.数据也被分成多个列
3.表也有表结构信息(列、列名、列类型、列约束等)
基于这个前提,DataFrame的组成如下:
在结构层面:
- StructType对象描述整个DataFrame的表结构
- StructField对象描述一个列的信息
在数据层面
- Row对象记录一行数据
- Column对象记录一列数据并包含列的信息
创建DataFrame的四种方式:
1.基于RDD转换成DataFrame
# coding:utf8
from pyspark import SparkContext
from pyspark.sql import SparkSession
if __name__ == '__main__':
spark = SparkSession.builder.appName("test").master("local[*]").getOrCreate()
sc = spark.sparkContext
# 基于RDD转换成DataFrame
rdd = sc.textFile("../data/sql/people.txt").map(lambda x: x.split(",")).map(lambda x: (x[0],int(x[1])))
# 构建DataFrame对象
# 参数1 被转换的RDD
# 参数2,通过list的形式指定,按照次序依次提供字符串名称即可
df = spark.createDataFrame(rdd,schema=['name','age'])
# 打印DataFrame的表结构
df.printSchema()
# 打印df中的数据
# 参数1,展示出多少条数据,没有则默认为20
# 参数2,表示是否对列进行截断,如果列的数据长度超过20个字符串长度,则后续内容以...形式展示
# 如果是False,则不截断全部显示,默认为True
df.show(20,False)
# 将DF对象转化为临时视图表,可供sql查询,参数1:临时视图表表名
df.createOrReplaceTempView("people")
spark.sql("select * from people where age < 30").show()
2.基于StructType对象去构建RDD到DF的转换
# coding:utf8
from pyspark import SparkContext
from pyspark.sql import SparkSession
from pyspark.sql.types import StructType, StringType, IntegerType
if __name__ == '__main__':
spark = SparkSession.builder.appName("test").master("local[*]").getOrCreate()
sc = spark.sparkContext
# 基于RDD转换成DataFrame
rdd = sc.textFile("../data/sql/people.txt").map(lambda x: x.split(",")).map(lambda x: (x[0],int(x[1])))
# 构建表结构的描述对象 StructType对象
schema = StructType().add("name",StringType(),False).\
add("age",IntegerType(),True)
# 基于StructType对象去构建RDD到DF的转换
df = spark.createDataFrame(rdd,schema=schema)
df.printSchema()
df.show()
3.利用toDF的方式转换
# coding:utf8
from pyspark import SparkContext
from pyspark.sql import SparkSession
from pyspark.sql.types import StructType, StringType, IntegerType
if __name__ == '__main__':
spark = SparkSession.builder.appName("test").master("local[*]").getOrCreate()
sc = spark.sparkContext
# 基于RDD转换成DataFrame
rdd = sc.textFile("../data/sql/people.txt").map(lambda x: x.split(",")).map(lambda x: (x[0],int(x[1])))
# toDF方式1: 只传列名,类型靠推断,是否运行为空是True
df1 = rdd.toDF(["name","age"])
df1.printSchema()
df1.show()
# 构建表结构的描述对象 StructType对象
# toDF方式2: 基于StructType对象去构建RDD到DF的转换
schema = StructType().add("name",StringType(),False). \
add("age",IntegerType(),True)
df2 = rdd.toDF(schema=schema)
df2.printSchema()
df2.show()
4.基于Pandas的DataFrame构建SparkSql的DataFrame对象
# coding:utf8
from pyspark import SparkContext
from pyspark.sql import SparkSession
from pyspark.sql.types import StructType, StringType, IntegerType
import pandas as pd
if __name__ == '__main__':
spark = SparkSession.builder.appName("test").master("local[*]").getOrCreate()
sc = spark.sparkContext
# 基于Pandas的DataFrame构建SparkSql的DataFrame对象
pdf = pd.DataFrame(
{
"id": [1, 2, 3],
"name": ["John", "Smith", "Piter"],
"age": [20, 30, 30]
}
)
df = spark.createDataFrame(pdf)
df.printSchema()
df.show()