我正在使用Pyspark sql讀取一個xml檔案,并將其加載為一個資料框架。該模式看起來像這樣:
root
|-- AuditFileCountry: string (nullable = true)
|-- AuditFileDateCreated: date (nullable = true)
|-- AuditFileVersion: double (nullable = true)
|-- Company: struct (nullable = true)
| |-- address: struct (nullable = true)
| | |-- 城市。 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)
問題是,源檔案中地址和公司結構下的PostalCode列有一個01234的值,但是你可以從模式中看到,這個列被讀取為Long資料型別,在這種情況下,資料框架中的值看起來像1234,0被丟失。即使我以后將資料型別轉換為StringType,0還是會丟失。
在將資料加載到資料框架中時,是否有辦法將該列的資料型別指定為StringType?
我知道我可以使用類似于
的方法來做這件事schema = StructType([
StructField('PostalCode', StringType(), True)
])
然后在加載資料時傳遞這個模式。 但資料框架的模式是嵌套的,而且你似乎不能像這樣簡單地指定該列的資料型別。
有什么辦法可以解決這個問題嗎?如果有任何幫助,我們將不勝感激!
uj5u.com熱心網友回復:
你不能簡單地為單個輸入列提供資料型別。有兩個選擇。
第一個是通過將閱讀器的inferSchema選項設定為False來完全禁用模式推理:
spark.read
.format('xml'/span>)
.option('inferSchema', False)
...
這將導致所有的XML欄位在資料集中被表示為字串,你需要在必要時手動轉換。如果模式是固定的,更好的選擇是提供完整的模式。在你的案例中,這將是這樣的:
schema = StructType([
StructField('AuditFileCountry', StringType, True)。
StructField('AuditFileDateCreated', DateType, True)。
StructField('AuditFileVersion', DoubleType, True)。
StructField('Company', StructType([
StructField('Address', StructType([
StructField('City', StringType, True)。
StructField('Country', StringType, True)。
StructField('Number', StringType, True)。
StructField('PostalCode', StringType, True)。
StructField('StreetName', StringType, True)
], True)。)
StructType('BankAccount', StructType([
StructField('BankAccountNumber', StringType, True)。
StructField('CurrencyCode', StringType, True)
], True)
], True)
])
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/324032.html
標籤:
