PySpark读取XML文件获取schema时报ClassNotFoundException如何解决
错误根因
你遇到的java.lang.ClassNotFoundException: Failed to find data source: xml报错,是因为Spark默认没有内置XML格式的解析数据源,需要引入第三方适配包才能使用format("xml")的读取能力。
解决方案
方案1:动态加载依赖(无需修改集群配置,适合临时测试)
根据你的运行场景选择对应的配置方式:
- 交互式pyspark终端启动时添加参数:
pyspark --packages com.databricks:spark-xml_2.11:0.11.0
- spark-submit提交脚本时添加参数:
spark-submit --packages com.databricks:spark-xml_2.11:0.11.0 你的脚本文件名.py
- Jupyter等绑定PySpark的场景,初始化SparkSession时指定配置:
from pyspark.sql import SparkSession spark = SparkSession.builder \ .config("spark.jars.packages", "com.databricks:spark-xml_2.11:0.11.0") \ .getOrCreate()
注:你使用的是Spark 2.4.4,对应Scala版本为2.11,此处选择的
spark-xml_2.11:0.11.0是兼容Spark 2.x的版本,不要选用更高版本的spark-xml包,高版本仅支持Spark 3.x。
方案2:集群预安装依赖(适合高频读取XML的场景)
将spark-xml的jar包下载到集群所有节点的Spark jars目录下,后续运行时无需额外添加参数,直接执行读取代码即可。
验证代码
依赖配置完成后,你原来的代码即可正常运行,若仅需推断Schema无需读取全量数据,可以添加samplingRatio参数采样部分数据提升效率:
path = "/.../.../.../filename.xml" # 将rowTag的值替换为XML文件中实际的行级标签名 df_xml = spark.read.format("xml") \ .option("rowTag", "你的实际行标签名") \ .option("samplingRatio", 0.1) \ .load(path) # 打印Schema df_xml.printSchema()
内容的提问来源于stack exchange,提问作者AdN
相关产品推荐
相关产品推荐

