如何在VSCode中通过Python/PySpark读写远程HDFS的Parquet文件?
解决方案:VSCode中Python脚本连接HDFS读取Parquet文件
问题根源
Jupyter Notebook里的sparkmagic已经预先配置了Livy集群连接、认证信息,Spark上下文默认绑定远程集群,相对路径直接映射到HDFS;而VSCode中本地启动的SparkSession默认是本地模式,会把相对路径解析成本地文件系统路径,导致找不到HDFS上的目标文件。
解决步骤
1. 配置SparkSession连接远程集群
修改main.py中的SparkSession初始化代码,添加和sparkmagic对齐的集群连接、认证配置:
import os import yaml from pyspark.sql import SparkSession def main(): spark = SparkSession.builder \ .config("spark.sql.legacy.timeParserPolicy","LEGACY") \ .config("spark.sql.legacy.parquet.datetimeRebaseModeInWrite", "LEGACY") \ .config("spark.yarn.maxAttempts", 0) \ # 绑定YARN集群模式 .config("spark.master", "yarn") \ .config("spark.submit.deployMode", "client") \ # 配置HDFS默认文件系统(替换为你的集群实际地址) .config("spark.hadoop.fs.defaultFS", "hdfs://your-hdfs-nameservice") \ # 配置Knox网关Basic认证,对应sparkmagic的配置 .config("spark.hadoop.knox.gateway.url", "https://test.x.knox.y.fr:8443/gateway/cdp-proxy-api") \ .config("spark.hadoop.knox.gateway.username", "admin") \ .config("spark.hadoop.knox.gateway.password", "abcd") \ .appName("HDFS_Parquet_Reader") \ .getOrCreate() # 读取HDFS上的Parquet文件,推荐使用完整HDFS路径 df = spark.read.parquet("hdfs://your-hdfs-nameservice/projects/DEV/parquet_folder/") # 若已将默认FS设为HDFS,也可直接用相对路径:spark.read.parquet("projects/DEV/parquet_folder/") Class_1(...) if __name__ == "__main__": main()
2. 匹配集群依赖版本
根据你的Hadoop/CDP集群版本,添加对应依赖包确保兼容性:
# 在SparkSession构建链中添加该行,替换为集群对应的Hadoop版本 .config("spark.jars.packages", "org.apache.hadoop:hadoop-client:3.3.4")
3. 路径解析验证
- 优先使用完整HDFS路径,避免相对路径的自动解析歧义
- 若必须使用相对路径,务必确认
spark.hadoop.fs.defaultFS已正确设置为HDFS地址,确保Spark将相对路径映射到HDFS而非本地文件系统
内容的提问来源于stack exchange,提问作者LJRB
相关产品推荐
相关产品推荐

