【发布时间】:2021-11-14 00:01:13
【问题描述】:
我正在使用 Pyspark sql 读取 xml 文件并将其加载为数据框。架构看起来像这样:
root
|-- AuditFileCountry: string (nullable = true)
|-- AuditFileDateCreated: date (nullable = true)
|-- AuditFileVersion: double (nullable = true)
|-- Company: struct (nullable = true)
| |-- Address: struct (nullable = true)
| | |-- City: string (nullable = true)
| | |-- Country: string (nullable = true)
| | |-- Number: string (nullable = true)
| | |-- PostalCode: long (nullable = true)
| | |-- StreetName: string (nullable = true)
| |-- BankAccount: struct (nullable = true)
| | |-- BankAccountNumber: string (nullable = true)
| | |-- CurrencyCode: string (nullable = true)
问题是源文件中 Address 和 Company Structs 下的 PostalCode 列具有类似 01234 的值,但是从架构中可以看出,该列被读取为 Long 数据类型,在这种情况下数据框中的值看起来像1234,而0 丢失了。即使我稍后将数据类型转换为 StringType,0 无论如何都会丢失。
在将数据加载到数据框时,有没有办法将此列的数据类型指定为StringType?
我知道我可以使用类似的东西来做到这一点
schema = StructType([
StructField('PostalCode', StringType(), True)
])
然后在加载数据时传递这个模式, 但是数据框的架构是嵌套的,您似乎无法像那样简单地指定该列的数据类型。
知道如何解决这个问题吗?任何帮助将不胜感激!
【问题讨论】:
-
假设您使用 Spark 的 Databricks XML 数据源,您可以将阅读器的
inferSchema选项设置为False,XML 中的所有字段都将被视为字符串。 -
@HristoIliev,谢谢,成功了!
标签: python xml apache-spark pyspark