gpt4 book ai didi

python - 我可以更改 Spark 数据框中列的可空性吗?

转载 作者:行者123 更新时间:2023-12-04 07:09:35 26 4
gpt4 key购买 nike

我在不可为空的数据框中有一个 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(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可以为空吗?

最佳答案

我知道这个问题已经得到解答,但是当我想出这个问题时,我正在寻找一个更通用的解决方案:

def set_df_columns_nullable(spark, df, column_list, nullable=True):
for struct_field in df.schema:
if struct_field.name in column_list:
struct_field.nullable = nullable
df_mod = spark.createDataFrame(df.rdd, df.schema)
return df_mod

然后你可以这样称呼它:
set_df_columns_nullable(spark,df,['name','age'])

关于python - 我可以更改 Spark 数据框中列的可空性吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46072411/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com