2016-10-07 5 views
1

Ich bin neu in pyspark und ein seltsames Problem konfrontiert bin. Ich versuche, einige Spalte nicht auf NULL festlegbare einzustellen, während eine CSV-Datensatz geladen.pyspark: StructField (..., ..., False) immer wieder `nullable = true` statt` nullable = false`

col1,col2,col3 
11,12,13 
21,22,23 
31,32,33 
41,42,43 
51,,53 

Es ist ein Nullwert in Zeile 5, Spalte 2 und ich will nicht, dass die Reihe in meinem DF bekommen: Ich kann meinen Fall mit einem sehr kleinen Datensatz (test.csv) reproduzieren. Ich habe alle Felder als nicht-nullable (nullable=false), aber ich bekomme ein Schema mit allen drei Spalten nullable=true haben. Dies geschieht auch dann, wenn ich alle drei Spalten als nicht nullfähig einstelle! Ich verwende die neueste verfügbare Version von Spark, 2.0.1.

Hier ist der Code:

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() kehrt:

root 
|-- col1: string (nullable = true) 
|-- col2: string (nullable = true) 
|-- col3: string (nullable = true) 

und df.show() kehrt:

:

+----+----+----+ 
|col1|col2|col3| 
+----+----+----+ 
| 11| 12| 13| 
| 21| 22| 23| 
| 31| 32| 33| 
| 41| 42| 43| 
| 51|null| 53| 
+----+----+----+ 

während ich diesen erwarten

Antwort

4

Während Funkenverhalten (Schalter False-True hier ist verwirrend es ist nichts grundlegend falsch hier los ist. nullable Argument ist keine Einschränkung, sondern eine Reflektion der Quellen- und Typensemantik, die bestimmte Arten der Optimierung ermöglicht

Sie geben an, dass Sie Nullwerte in Ihren Daten vermeiden möchten. Dazu sollten Sie na.drop Methode verwenden.

df.na.drop() 

Für andere Wege im Umgang mit NULL-Wert bitte einen Blick auf den DataFrameNaFunctions nehmen (ausgesetzt mit DataFrame.na Eigenschaft) Dokumentation.

CSV-Format bietet keine Tools, die Ihnen erlauben Datenbeschränkungen angeben, damit definitions Leser nicht, dass die Eingabe übernehmen nicht null ist und Ihre Daten tatsächlich enthält NULL-Werte.