【发布时间】:2017-09-06 10:06:27
【问题描述】:
我在数据框中有一个不可为空的 StructField。简单例子:
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(年龄,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) 不是 JSON 可序列化的
我也在堆栈跟踪中看到了这一点:
raise ValueError("检测到循环引用")
所以我有点卡住了。任何人都可以修改这个示例,使我能够定义一个数据框,其中列 foo 可以为空?
【问题讨论】:
标签: python pyspark apache-spark-sql