PySpark用Databricks XML库读取XML到DataFrame时如何保留前导零
解决方案
- 方法1:强制所有基础类型读取为字符串(最适合无预先Schema的场景)
Spark XML库提供primitiveAsString参数,开启后所有原生基础类型(整数、浮点数、布尔值等)都会被直接读取为字符串类型,不会触发自动类型推断转换,完美保留前导零。配合关闭inferSchema参数即可不需要提前定义任何Schema规则。
代码示例(PySpark):
df = spark.read.format("xml") \ .option("rowTag", "替换为你的XML行节点标签") \ .option("inferSchema", "false") \ .option("primitiveAsString", "true") \ .load("替换为你的XML文件路径")
代码示例(Scala):
val df = spark.read.format("xml") .option("rowTag", "替换为你的XML行节点标签") .option("inferSchema", "false") .option("primitiveAsString", "true") .load("替换为你的XML文件路径")
- 方法2:自定义部分Schema(后续明确字段类型后可使用)
如果你后续梳理清楚了字段规则,仅需要特定字段保留字符串类型、其他字段正常推断类型,可以自定义Partial Schema,仅给需要保留前导零的字段指定StringType,其余字段走默认推断逻辑即可:
示例(PySpark):
from pyspark.sql.types import StructType, StructField, StringType, IntegerType # 仅指定需要保留前导零的字段为字符串类型,其余字段不定义即可 custom_schema = StructType([ StructField("id", StringType(), True), # 该字段要保留前导零,指定为字符串 StructField("age", IntegerType(), True) # 该字段为正常数值,指定为整型 ]) df = spark.read.format("xml") \ .option("rowTag", "替换为你的XML行节点标签") \ .schema(custom_schema) \ .load("替换为你的XML文件路径")
- 后续处理说明
如果读完之后需要把部分字符串类型的数值转为数值类型用于计算,直接使用cast方法转换对应字段即可,不会影响其他保留前导零的字段。
内容的提问来源于stack exchange,提问作者Pradeep kumar reddy Byreddy
相关产品推荐
相关产品推荐

