Spark 中数据读取方式详解:SparkSQL(DataFrame)与 SparkCore(RDD)方法对比及实践

在PySpark中,读取数据是数据处理流程的关键步骤。SparkCore(基于RDD)和SparkSQL(基于DataFrame)提供了不同的读取方式。下面我将以结构化的方式逐步解释这些方法,确保内容清晰易懂。所有代码示例均使用PySpark语法,并基于您提供的SparkSession创建模板(SparkSession.builder...getOrCreate())。以下内容分为两部分:SparkSQL读取方式(推荐,适用于结构化数据)和SparkCore读取方式(底层,适用于非结构化数据)。注意,实际应用中SparkSQL更常用,因为它优化了性能并提供丰富API。

1. SparkSQL读取数据方式(使用DataFrame API)

SparkSQL通过spark.read接口读取数据,支持多种数据源。核心方法是先创建SparkSession(如您示例所示),然后调用对应方法。参数包括数据源地址、类型和选项(通过option配置)。以下是常见场景的代码示例:

(1) 给定读取数据源的类型和地址,直接调用对应方法
  • 根据文件格式(如CSV、JSON、Parquet)直接调用方法,指定文件路径。

  • 示例:读取CSV文件

    python 复制代码
    from pyspark.sql import SparkSession
    
    # 创建SparkSession(参考您的模板)
    with SparkSession.builder.master("local[2]").appName("Demo").config("spark.sql.shuffle.partitions", 2).getOrCreate() as spark:
        # 直接调用csv方法,指定路径
        df_csv = spark.read.csv("path/to/file.csv")  # 基本读取
        df_csv.show()
    
    # 类似地,读取JSON文件
    with SparkSession.builder...getOrCreate() as spark:  # 省略重复代码
        df_json = spark.read.json("path/to/file.json")
        df_json.show()
    
    # 读取Parquet文件
    with SparkSession.builder...getOrCreate() as spark:
        df_parquet = spark.read.parquet("path/to/file.parquet")
        df_parquet.show()
(2) 使用option参数指定读取配置
  • option用于添加额外选项,如处理头信息、推断模式等。

  • 示例:读取CSV文件时启用头信息和模式推断

    python 复制代码
    with SparkSession.builder...getOrCreate() as spark:
        # 使用option设置header和inferSchema
        df = spark.read.option("header", "true").option("inferSchema", "true").csv("path/to/file.csv")
        df.printSchema()  # 显示模式
  • 常用选项:

    • header:是否使用第一行作为列名(默认false)。
    • inferSchema:是否自动推断数据类型(默认false)。
    • delimiter:指定分隔符(如,)。
    • 多个选项可链式调用:.option("key1", "value1").option("key2", "value2")...
(3) 通过JDBC读取数据库数据
  • 使用spark.read.jdbc方法连接关系型数据库(如MySQL、PostgreSQL)。

  • 需提供JDBC URL、表名、连接属性(用户名、密码等)。

  • 示例:读取PostgreSQL数据库表

    python 复制代码
    with SparkSession.builder...getOrCreate() as spark:
        # JDBC连接参数
        jdbc_url = "jdbc:postgresql://localhost:5432/mydatabase"
        properties = {
            "user": "your_username",
            "password": "your_password",
            "driver": "org.postgresql.Driver"  # 需确保驱动在classpath
        }
        # 读取表数据
        df_jdbc = spark.read.jdbc(url=jdbc_url, table="tablename", properties=properties)
        df_jdbc.show()
(4) 读取Hive表数据
  • SparkSession默认支持Hive集成(需配置Hive元存储)。

  • 使用spark.read.table读取表,或直接执行SQL查询。

  • 示例:读取Hive表

    python 复制代码
    with SparkSession.builder...getOrCreate() as spark:
        # 方法1: 直接读取表
        df_hive = spark.read.table("database_name.table_name")  # 表名需完整
        df_hive.show()
    
        # 方法2: 使用SQL查询(更灵活)
        spark.sql("SELECT * FROM database_name.table_name").show()

2. SparkCore读取数据方式(使用RDD API)

SparkCore基于RDD(Resilient Distributed Dataset),适用于非结构化数据(如文本文件)。它通过SparkContext读取,但功能较基础,不直接支持选项或结构化查询。核心方法是textFile读取文本文件为RDD。

  • 创建SparkContext :在SparkSession中获取SparkContext

  • 读取文本文件 :使用sc.textFile方法,指定文件路径。

  • 示例:读取文本文件为RDD

    python 复制代码
    from pyspark import SparkContext
    
    # 创建SparkSession(先获取SparkContext)
    with SparkSession.builder...getOrCreate() as spark:
        sc = spark.sparkContext  # 从SparkSession获取SparkContext
        
        # 读取文本文件
        rdd = sc.textFile("path/to/file.txt")  # 返回RDD[String]
        
        # 处理RDD(例如,打印前10行)
        print(rdd.take(10))
  • 注意:

    • RDD方式不支持option参数,所有解析需手动处理。
    • 对于结构化数据(如CSV),推荐先使用SparkSQL读取为DataFrame,再转换为RDD(df.rdd),以获得更好性能。

总结

  • SparkSQL(DataFrame API) :首选方式,支持丰富数据源(文件、JDBC、Hive表)和option参数,适合结构化数据处理。代码简洁高效。
  • SparkCore(RDD API):底层方式,仅适合文本文件读取,功能有限,但灵活性强。
  • 最佳实践:优先使用SparkSQL,除非需要低级控制。
相关推荐
大千AI助手6 小时前
分布式奇异值分解(SVD)详解
人工智能·分布式·spark·奇异值分解·svd·矩阵分解·分布式svd
AgeClub6 小时前
当“钢铁护工”进入家庭,Figure 03如何重建老年居家生活?
大数据·人工智能
代码匠心7 小时前
从零开始学Flink:事件驱动
java·大数据·flink·大数据处理
Lx3528 小时前
Flink自定义函数:UDF、UDAF和UDTF实战
大数据
jiuweiC8 小时前
常用es sql
大数据·sql·elasticsearch
武子康10 小时前
大数据-143 ClickHouse 实战MergeTree 分区/TTL、物化视图、ALTER 与 system.parts 全流程示例
大数据·后端·nosql
Hello.Reader10 小时前
用 Spark Shell 做交互式数据分析从入门到自包含应用
大数据·数据分析·spark
qq_124987075311 小时前
基于hadoop的电商用户行为分析系统(源码+论文+部署+安装)
大数据·hadoop·分布式·毕业设计