如何在PySpark中读取文件名含未知时间戳的CSV文件
解决方案
报错根因
该Path does not exist报错一般由两类问题导致:
- Spark默认优先读取HDFS路径,未显式声明本地文件协议时不会检索本地磁盘文件
- 低版本Spark对本地路径的通配符匹配支持性较差,无法正确解析
*通配符规则
修复步骤
你可以按以下方案逐一验证修复:
方案1:修正本地文件URI前缀(最快修复)
本地文件的标准URI格式为file:///(三个斜杠,代表省略host字段指向本地),修正路径写法即可:
df_read_file = sqlContext.read.format('com.databricks.spark.csv')\ .option("delimiter", '|')\ .options(header='true',quote='', escape='\"', inferSchema='false')\ .load('file:///app/HTA/SrcFiles/inbound/metadata/projectno_without_data_*.csv')
方案2:预匹配文件路径列表(兼容性最高,适配所有Spark版本)
如果方案1不生效,可以先用Python的glob模块提前匹配所有符合规则的文件路径,再将路径列表直接传给Spark的load方法,不需要Spark自行解析通配符:
import glob # 提前匹配所有符合命名规则的本地文件绝对路径 matched_files = glob.glob('/app/HTA/SrcFiles/inbound/metadata/projectno_without_data_*.csv') df_read_file = sqlContext.read.format('com.databricks.spark.csv')\ .option("delimiter", '|')\ .options(header='true',quote='', escape='\"', inferSchema='false')\ .load(matched_files)
额外注意事项
- 如果是集群模式运行Spark任务,需要保证所有Worker节点都能访问对应路径的文件,或者将csv文件上传到HDFS用HDFS路径读取,避免只有Driver节点能访问本地文件的问题
- Spark 2.0+版本更推荐使用
SparkSession替代已过时的sqlContext,写法更简洁:
from pyspark.sql import SparkSession spark = SparkSession.builder.appName("read_timestamp_csv").getOrCreate() df_read_file = spark.read.csv( path=matched_files, sep='|', header=True, quote='', escape='\"', inferSchema=False )
内容的提问来源于stack exchange,提问作者Shivika
相关产品推荐
相关产品推荐

