如何在PySpark中不使用Databricks依赖读取并解析XML文件
问题原因说明
报错的根本原因是Apache Spark官方默认没有内置XML格式的数据源支持,调用format('xml')时Spark找不到对应的实现类,才抛出ClassNotFoundException。你提到的databricks的spark-xml包是目前Spark生态中唯一稳定维护的XML读写组件,不属于databricks商业付费产品范畴,开源可免费使用。如果坚持完全不使用第三方依赖,只能走自定义解析的路线。
解决方案1:使用spark-xml包(推荐,性能最高兼容性最好)
匹配你的运行环境(Spark3.1.2、Scala2.12),对应适配的spark-xml版本为spark-xml_2.12:0.14.0,有三种引入方式可选:
- 交互式启动pyspark时指定依赖:
pyspark --packages com.databricks:spark-xml_2.12:0.14.0
- 提交作业时指定依赖:
spark-submit --packages com.databricks:spark-xml_2.12:0.14.0 你的脚本名.py
- 代码初始化SparkSession时指定依赖:
from pyspark.sql import SparkSession spark = SparkSession.builder \ .appName("XmlParseTask") \ .config("spark.jars.packages", "com.databricks:spark-xml_2.12:0.14.0") \ .getOrCreate()
依赖引入完成后,两种读取写法都可以正常运行:
# 短名写法 df = spark.read.format('xml').options(rowTag='file').load('ted_en-20160408.xml') # 全类名写法 df = spark.read.format('com.databricks.spark.xml').options(rowTag='file').load('ted_en-20160408.xml')
解决方案2:完全不依赖第三方包的实现(仅适合小文件)
如果XML文件体积较小,可以用Python原生XML解析库读取后转成Spark DataFrame,性能远低于spark-xml组件,大文件会出现内存溢出问题:
import xml.etree.ElementTree as ET from pyspark.sql import Row # 读取XML文件内容 with open('ted_en-20160408.xml', 'r', encoding='utf-8') as f: xml_content = f.read() # 解析节点提取数据 root = ET.fromstring(xml_content) row_list = [] for node in root.findall('file'): # 对应之前配置的rowTag参数 # 按实际字段需求提取节点内容 row_data = {sub_node.tag: sub_node.text for sub_node in node} row_list.append(Row(**row_data)) # 转换为Spark DataFrame df = spark.createDataFrame(row_list)
内容的提问来源于stack exchange,提问作者starlight
相关产品推荐
相关产品推荐

