【博学谷学习记录】超强总结,用心分享|狂野大数据课程【Spark SQL的数据写出操作】的总结分析

该代码示例展示了如何使用PySpark将数据写出到HDFS,包括CSV、JSON和ORC格式,以及如何配置环境变量以确保一致性。此外,讨论了输出模式(如追加和覆盖),并提及了将数据写入Hive表和MySQL数据库的方法,但指出在没有集成的情况下无法演示Hive操作。
摘要由CSDN通过智能技术生成

统一的输出的语法:

在这里插入图片描述

  • 演示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包

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值