2017-09-06 6 views
0

nullableではないデータフレームにStructFieldがあります。簡単な例:Sparkデータフレーム内のカラムのNULL可能性を変更できますか?

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 

返す:フィールドfooがNULL可能ではないことを

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

お知らせ。問題は、(私が入ってこない理由のために)私はそれがnullableになりたいということです。私はまた、スタックトレースでこれを見

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

::で失敗しました

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) 

:私はそれを行う方法を提案し、このポストはChange nullable property of column in spark dataframeので、私はこれに、その中にコードを適応した

raise ValueError("Circular reference detected")

私はちょっと立ち往生しています。誰でもこの例を変更して、カラムfooがnullableのデータフレームを定義できるようにすることはできますか?

答えて

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

よく恥ずかしいです。ありがとうRudra :) – jamiet

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

出力:

root 
|-- name: string (nullable = true) 
|-- age: long (nullable = true) 
|-- foo: boolean (nullable = true) 
関連する問題