gpt4 book ai didi

apache-spark - 比较模式忽略可为空

转载 作者:行者123 更新时间:2023-12-04 04:08:02 24 4
gpt4 key购买 nike

我正在尝试比较 2 个数据框的模式。
基本上,列和类型是相同的,但“可空”可以不同:

数据框 A

StructType(List(
StructField(ClientId,StringType,True),
StructField(PublicId,StringType,True),
StructField(ExternalIds,ArrayType(StructType(List(
StructField(AppId,StringType,True),
StructField(ExtId,StringType,True),
)),True),True),
....

数据框 B
StructType(List(
StructField(ClientId,StringType,True),
StructField(PublicId,StringType,False),
StructField(ExternalIds,ArrayType(StructType(List(
StructField(AppId,StringType,True),
StructField(ExtId,StringType,False),
)),True),True),
....

当我这样做时 df_A.schema == df_B.schema , 结果如果 False明显地。
但是我想忽略“nullable”参数,不管是false还是true,如果结构相同,应该返回 True .

是否可以 ?

最佳答案

使用以下两个 DataFrame 架构的示例:

df_A.printSchema()
#root
# |-- ClientId: string (nullable = true)
# |-- PublicId: string (nullable = true)
# |-- PartyType: string (nullable = true)

df_B.printSchema()
#root
# |-- ClientId: string (nullable = true)
# |-- PublicId: string (nullable = true)
# |-- PartyType: string (nullable = false)

并假设字段的顺序相同,您可以访问 namedataType模式中的每个字段并将它们压缩以进行比较:

print(
all(
(a.name, a.dataType) == (b.name, b.dataType)
for a,b in zip(df_A.schema, df_B.schema)
)
)
#True

如果它们的顺序不同,您可以比较排序的字段:

print(
all(
(a.name, a.dataType) == (b.name, b.dataType)
for a,b in zip(
sorted(df_A.schema, key=lambda x: (x.name, x.dataType)),
sorted(df_B.schema, key=lambda x: (x.name, x.dataType))
)
)
)
#True

如果两个 DataFrame 的列数可能不同,您可以首先比较模式长度作为短路检查 - 如果失败,请不要打扰遍历字段:

print(len(df_A.schema) == len(df_B.schema))
#True

关于apache-spark - 比较模式忽略可为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50609548/

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