统一的输出的语法:
- 演示1: 输出到文件中 json csv orc text ….
from pyspark import SparkContext, SparkConf
from pyspark.sql import SparkSession
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("演示: 数据写出操作")
# 1. 创建SparkSession的对象
spark = SparkSession.builder.appName('df_write').master('local[*]').getOrCreate()
# 2. 内部初始化相关的数据集
df = spark.createDataFrame(
data=[(1,'张三',20),(2,'李四',18),(3,'王五',25),(4,'赵六',23),(5,'田七',24)],
schema='id int,name string,age int'
)
# 3. 对数据执行相关的操作: 筛选出年龄大于20岁
df = df.where('age > 20')
# 4- 将数据写出到HDFS中
# df.write\
# .mode('overwrite')\
# .format('csv')\
# .option('sep','|')\
# .option('header',True)\
# .save(path='hdfs://node1:8020/spark/output/put1')
# df.write \
# .mode('overwrite') \
# .format('json') \
# .save(path='hdfs://node1:8020/spark/output/put2')
# df.write \
# .mode('overwrite') \
# .format('orc') \
# .save(path='hdfs://node1:8020/spark/output/put3')
df.write.csv(
path='hdfs://node1:8020/spark/output/put4',
header=True,
sep=',',
encoding='GBK',
mode='overwrite'
)
"""
mode: 输出模式
可选的值:
append: 追加模式, 将结果数据追加到指定位置下, 如果位置不存在, 会创建
overwrite: 覆盖模式 将数据覆盖到指定的位置下, 不管位置是否存在, 都是先删除, 然后在添加
error: 错误, 将数据添加到指定的位置下, 如果指定的位置以存在, 直接报错, 否则正常创建添加
ignore: 忽略, 将数据添加到指定的位置下, 如果执行的位置下已经有了, 那么直接忽略当前的写入
"""
- 可以将结果数据输出到Hive的表中
df.write.mode().saveAsTable(参数1,参数2)
参数1: 表名 如果需要指定数据库 可以写成 库名.表名
参数2: 输出格式
目前, 输出到HIVE的操作, 无法进行演示, 因为当前Spark SQL还没有和HIVE进行整合
- 将结果数据基于JDBC方案, 输出到关系型数据库, 例如说: MySQL
from pyspark import SparkContext, SparkConf
from pyspark.sql import SparkSession
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("演示: 数据写出操作")
# 1. 创建SparkSession的对象
spark = SparkSession.builder.appName('df_write').master('local[*]').getOrCreate()
# 2. 内部初始化相关的数据集
df = spark.createDataFrame(
data=[(1, '张三', 20), (2, '李四', 18), (3, '王五', 25), (4, '赵六', 23), (5, '田七', 24)],
schema='id int,name string,age int'
)
# 3. 对数据执行相关的操作: 筛选出年龄大于20岁
df = df.where('age > 20')
# 4- 将数据写出到MySQL
"""
建库语句: create database day10_pyspark char set 'utf8';
建表语句:
create table day10_pyspark.stu(
id int,
name varchar(20),
age int
);
"""
df.write.jdbc(
url='jdbc:mysql://node1:3306/day10_pyspark?useUnicode=true&characterEncoding=utf8',
table='stu',
mode='append',
properties={'user': 'root', 'password': '123456'}
)
如果由程序自动构建mysql的表, 或者采用overwrite模式, 请注意, 数据类型选择上会较大
比如说: 字符串类型, 正常varchar, 但是系统创建表的时候, 会选择text
一般建议是自己建表, 然后可以采用append的模式添加数据
可能出现的错误:
原因: 缺少连接Mysql数据库的驱动jar包
如何放置驱动包呢?
1- 放置位置一: 当Spark-submit提交的运行环境为Spark集群环境的时候, 以及运行模式为local,默认从spark的jars目录下加载相关的jar包
目录位置: /export/server/spark/jars/
2- 放置位置二: 当我们使用pycharm运行代码的时候, 基于python的环境来运行的,需要在python的环境中可以加载到相关的jar包
目录位置: /root/anaconda3/lib/python3.8/site-packages/pyspark/jars/
3- 放置位置三: 当我们选择提交模式on yarn模式, 需要保证此jar包在HDFS上对应的目录下
目录位置: hdfs://node1:8020/spark/jars
请注意: 以上三个位置, 主要是用于放置一些spark可能会经常使用的jar包, 对于一些不经常使用的jar包, 在后续通过spark-submit提交运行的时候, 会采用 --jars 参数 指定额外的第三方的一些jar包