spark dataframe和spark sql

三、掌握对spark dataframe和spark sql的认识和使用(包括创建、各种常用操作,具体到代码的编写使用);

1、DataFrame介绍

在Spark中,Spark DataFrame和Spark SQL是SparkRDD高层次的封装,Spark DataFrame以RDD为基础,是一种与传统数据库中的二维表格相类似的分布式数据集。

DataFrame与RDD的主要区别:前者包含每一列的名称和类型

2、创建Spark DataFrame

(1)通过本地数据结构(list或tuple)创建Spark DataFrame

from pyspark import SparkContext
from pyspark import SQLContext
# 实例化一个SparkContext对象sc(如果是pyspark命令行,默认有一个sc对象,无需实例化sc)
sc = SparkContext()
# 实例化一个SQLContext对象sqlContext ,需要将sc作为参数传入(如果是pyspark命令行,默认有一个sqlContext对象,无需实例化sqlContext )
sqlContext = SQLContext(sc)
a_list = [("Jack", 20, "male"), ("Rose", 18, "female"), ("Tom", 19, "male")]
df = sqlContext. createDataFrame (a_list, [“name”, “age”, “gender”]) # 第一个参数为序列对象,第二个参数指定列名
df.show()  # show方法展示当前Spark DataFrame的数据

(2)通过RDD创建Spark DataFrame

from pyspark import SparkContext
from pyspark import SQLContext
sc = SparkContext()
sqlContext = SQLContext(sc)
a_list = [("Jack", 20, "male"), ("Rose", 18, "female"), ("Tom", 19, "male")]
rdd = sc.parallelize(a_list)
df = sqlContext.createDataFrame(rdd, ["name", "age", "gender"])  # 第一个参数为RDD对象,第二个参数指定列名
df.show()  # show方法展示当前Spark DataFrame的数据

(3)通过Pandas DataFrame创建Spark DataFrame

from pyspark import SparkContext
from pyspark import SQLContext
import pandas as pd
pd_df = pd.read_csv("student_info.csv")
sc = SparkContext()
sqlContext = SQLContext(sc)
df = sqlContext.createDataFrame(pd_df)  # pandas dataframe已经是行列结构的数据,自带列名,不需要再设置列名,第二个参数若传则有,不传则默认
df.show()  # show方法展示当前Spark DataFrame的数据

注意: createDataFrame方法的参数,请参考上一页PPT。第二个参数不传的话,如果该数据源有列名,就会用该列名,否则使用spark的默认列名。如果传第二个参数,则不管数据源中有没有列名,都以传入的参数为列名。

(4)通过csv文件创建Spark DataFrame

sc = SparkContext()
sqlContext = SQLContext(sc)
df_reader = sqlContext.read  # sqlContext的read属性可以获取一个DataFrameReader对象
df = df_reader.schema("name String, age Int, gender String").csv(path="student_info.csv")  # 路径可以是hdfs路径
df.show()

注意:上述程序中对csv文件的格式是有要求的,要求表头不带列名——因为程序中的红色部分已经声明表头了,csv文件中再有表头,会造成第一行全是null值

(5)通过txt文件创建Spark DataFrame

sc = SparkContext()
sqlContext = SQLContext(sc)
df_reader = sqlContext.read  # sqlContext的read属性可以获取一个DataFrameReader对象
df = df_reader.schema(“name String”).text(paths=“names.txt”) # paths可以是一个文件,也可以是一个文件夹
df.show()

注意:txt文件的格式是有要求的,要求每一行只能是一个字段的数据,并且该字段的类型只能为String类型。

(6)通过json文件创建Spark DataFrame

sc = SparkContext()
sqlContext = SQLContext(sc)
df_reader = sqlContext.read  # sqlContext的read属性可以获取一个DataFrameReader对象
df = df_reader.json(path="student_info.json")
df.show()

(7)通过parquet文件创建Spark DataFrame

sc = SparkContext()
sqlContext = SQLContext(sc)
df_reader = sqlContext.read  # sqlContext的read属性可以获取一个DataFrameReader对象
df = df_reader. parquet(paths=“user_info”)  #  注意这是一个文件夹,里面有多个parquet文件
df.show()

(8)通过Hive数据表创建Spark DataFrame

sc = SparkContext()
sqlContext = SQLContext(sc)
df = sqlContext.table(“test_table")
df.show()

(9)通过mysql数据库表创建Spark DataFrame

sc = SparkContext()
sqlContext = SQLContext(sc)
df_reader = sqlContext.read  # sqlContext的read属性可以获取一个DataFrameReader对象
# url设置数据库地址
# table设置要查询的数据库表
# properties 设置连接参数,是一个字典
df = df_reader.jdbc(url="jdbc:mysql://127.0.0.1:3306/student", table="student_info",
                    properties=dict(user="root", password="root", driver="com.mysql.jdbc.Driver"))
df.show(10)

3、DataFrame的常用操作(函数/方法)

4、Spark SQL操作示例

image-20220105015141678

4、Spark SQL与DataFrame的区别与联系

DataFrame是一个分布式的数据集合,它按行组织,每行包含一组列,每列都有一个名称和一个关联的类型。换句话说,这个分布式数据集合具有由Schema定义的结构。你可以将它视为关系数据库中的表,但在底层,它具有更丰富的优化。
Spark SQL 是由DataFrame派生出来的,使用Spark SQL 之前必须先创建DataFrame,再注册临时表,然后才能使用Spark SQL。
Spark DataFrame是Spark的核心基础类, Spark SQL 是对DataFrame的高级封装。
Spark SQL相比于Spark DataFrame更灵活易用。

posted @ 2022-04-08 20:02  星月故里yw  阅读(493)  评论(0)    收藏  举报