试述 Spark SQL 对接外部数据源(包括 JDBC、HDFS 等)的常用方式,并说明在实际应用中如何实现数据的读取导入与写出导出?
考察说明
考察候选人对 Spark SQL 外部数据源集成机制及数据读写实践的理解。
回答思路
- 【回答框架 1】Spark SQL 通过 DataFrameReader 和 DataFrameWriter 统一封装外部数据源读写。读取时调用 spark.read.format(...).options(...).load(),写出时调用 df.write.format(...).options(...).save(),底层由 DataSource API 的数据源实现完成数据解析与转换。
- 【回答框架 2】对接 HDFS 时通常直接使用 Parquet、ORC、JSON、CSV 等内置格式。读取示例:spark.read.parquet("hdfs://path");写出可指定分区列,如 df.write.partitionBy("dt").parquet(...),并可通过 mode("overwrite") 或 mode("append") 控制写入模式。
- 【回答框架 3】对接 JDBC 时通过 format("jdbc") 指定 url、dbtable、user、password 等选项。读取时可用 numPartitions 与 partitionColumn 实现并行分区拉取;写出时注意批次大小和事务边界,避免频繁提交。
- 【回答框架 4】数据导入导出还需考虑类型映射、字符编码、时间精度等兼容问题。例如 JDBC 的 DECIMAL 与 Spark 的 DecimalType 映射,HDFS 上小文件过多会降低读取性能,建议合理分区和文件大小。
- 【关键点 1】Spark SQL 通过 DataFrameReader/DataFrameWriter 统一读写外部数据源,核心是 DataSource API。
- 【关键点 2】HDFS 常用内置格式如 Parquet、ORC、JSON、CSV,支持分区与写入模式控制。
- 【关键点 3】JDBC 数据源通过 format('jdbc') 配置连接参数,可用 partitionColumn 与 numPartitions 提升并行读取。
- 【关键点 4】写出 JDBC 时注意控制批量大小,避免频繁 commit 导致性能问题。
- 【关键点 5】不同类型映射和文件布局优化是数据导入导出的常见实践要点。
- 【易错点 1】误以为 Spark SQL 只能通过 SQL 语句访问外部数据,而忽略 DataFrame API 的统一性。
- 【易错点 2】不明确 JDBC 读取默认是单分区,数据量大时性能差,需显式分区。
- 【易错点 3】忽略类型映射和兼容性检查,可能导致数据丢失或转换错误。