2017-09-06 89 views
0

我有一个不可为空的数据框中的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为空这个例子吗?

回答

2

看来你错过了StructType(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

那真是令人尴尬。谢谢:)楼陀罗 – jamiet

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

输出:

root 
|-- name: string (nullable = true) 
|-- age: long (nullable = true) 
|-- foo: boolean (nullable = true) 
相关问题