学习的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()