[英]PySpark: StructField(…, …, False) always returns `nullable=true` instead of `nullable=false`
我是PySpark的新手,面臨一個奇怪的問題。 我正在嘗試在加載CSV數據集時將某些列設置為不可為空。 我可以用一個非常小的數據集( test.csv
)重現我的情況:
col1,col2,col3
11,12,13
21,22,23
31,32,33
41,42,43
51,,53
在第5行第2列有一個空值,我不想在我的DF中獲得該行。 我將所有字段設置為非可空( nullable=false
)但我得到一個模式,其中所有三列都具有nullable=true
。 即使我將所有三列都設置為不可為空,也會發生這種情況! 我正在運行最新版本的Spark 2.0.1。
這是代碼:
from pyspark.sql import SparkSession
from pyspark.sql.functions import *
from pyspark.sql.types import *
spark = SparkSession \
.builder \
.appName("Python Spark SQL basic example") \
.config("spark.some.config.option", "some-value") \
.getOrCreate()
struct = StructType([ StructField("col1", StringType(), False), \
StructField("col2", StringType(), False), \
StructField("col3", StringType(), False) \
])
df = spark.read.load("test.csv", schema=struct, format="csv", header="true")
df.printSchema()
返回:
root
|-- col1: string (nullable = true)
|-- col2: string (nullable = true)
|-- col3: string (nullable = true)
和df.show()
返回:
+----+----+----+
|col1|col2|col3|
+----+----+----+
| 11| 12| 13|
| 21| 22| 23|
| 31| 32| 33|
| 41| 42| 43|
| 51|null| 53|
+----+----+----+
雖然我期待這個:
root
|-- col1: string (nullable = false)
|-- col2: string (nullable = false)
|-- col3: string (nullable = false)
+----+----+----+
|col1|col2|col3|
+----+----+----+
| 11| 12| 13|
| 21| 22| 23|
| 31| 32| 33|
| 41| 42| 43|
+----+----+----+
雖然Spark行為(在這里從False
切換到True
是令人困惑的,但這里沒有任何根本性的錯誤nullable
參數不是約束,而是源和類型語義的反映,它允許某些類型的優化
您聲明要避免數據中的空值。 為此你應該使用na.drop
方法。
df.na.drop()
有關處理空值的其他方法,請查看DataFrameNaFunctions
(使用DataFrame.na
屬性公開)文檔。
CSV格式不提供任何允許您指定數據約束的工具,因此定義讀者不能假定輸入不為空且您的數據確實包含空值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.