我有一个不可为空的数据框中的StructField。简单的例子:我可以更改Spark数据框中列的可空性吗?
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
返回:
[StructField(name,StringType,true), StructField(age,LongType,true), StructField(foo,BooleanType,false)]
注意,场foo
不能为空。问题是(因为我不会进入)我希望它是可空的。我发现这个职位Change nullable property of column in spark dataframe这说明这样做的一种方式,所以我适应其中的代码如下:
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)
其失败:
TypeError: StructField(name,StringType,true) is not JSON serializable
我也看到这个堆栈跟踪:
raise ValueError("Circular reference detected")
所以我有点卡住了。任何人都可以修改的方式,使我能够定义一个数据帧,其中列foo
为空这个例子吗?
那真是令人尴尬。谢谢:)楼陀罗 – jamiet