2017-09-06 1 views
0

Ich habe ein StructField in einem Datenrahmen, der nicht nullbar ist. Einfaches Beispiel:Kann ich die NULL-Zulässigkeit einer Spalte in meinem Spark-Datenrahmen ändern?

import pyspark.sql.functions as F 
from pyspark.sql.types import * 
l = [('Alice', 1)] 
df = sqlContext.createDataFrame(l, ['name', 'age']) 
df = df.withColumn('foo', F.when(df['name'].isNull(),False).otherwise(True)) 
df.schema.fields 

, die zurückgibt:

[StructField(name,StringType,true), StructField(age,LongType,true), StructField(foo,BooleanType,false)]

Beachten Sie, dass das Feld foo nicht NULL-Werte zulässt. Das Problem ist, dass ich (aus Gründen, auf die ich nicht eingehen werde) möchte, dass es nullfähig ist. Ich fand diesen Beitrag Change nullable property of column in spark dataframe, die einen Weg vorgeschlagen, der es damit ich den Code darin dazu angepasst:

import pyspark.sql.functions as F 
from pyspark.sql.types import * 
l = [('Alice', 1)] 
df = sqlContext.createDataFrame(l, ['name', 'age']) 
df = df.withColumn('foo', F.when(df['name'].isNull(),False).otherwise(True)) 
df.schema.fields 
newSchema = [StructField('name',StringType(),True), StructField('age',LongType(),True),StructField('foo',BooleanType(),False)] 
df2 = sqlContext.createDataFrame(df.rdd, newSchema) 

, die mit fehlgeschlagen:

TypeError: StructField(name,StringType,true) is not JSON serializable

Ich sehe dies auch in dem Stack-Trace:

raise ValueError("Circular reference detected")

Also bin ich ein bisschen fest. Kann jemand dieses Beispiel so ändern, dass ich einen Datenrahmen definieren kann, in dem die Spalte foo nullfähig ist?

Antwort

2

scheint, dass Sie die StructType verpasst (newSchema).

l = [('Alice', 1)] 
df = sqlContext.createDataFrame(l, ['name', 'age']) 
df = df.withColumn('foo', F.when(df['name'].isNull(),False).otherwise(True)) 
df.schema.fields 
newSchema = [StructField('name',StringType(),True), StructField('age',LongType(),True),StructField('foo',BooleanType(),False)] 
df2 = sqlContext.createDataFrame(df.rdd, StructType(newSchema)) 
df2.show() 
+0

Nun, das ist peinlich. Danke Rudra :) – jamiet

0
df1 = df.rdd.toDF() 
df1.printSchema() 

Ausgang:

root 
|-- name: string (nullable = true) 
|-- age: long (nullable = true) 
|-- foo: boolean (nullable = true) 
Verwandte Themen