Ste*_*ven 6 apache-spark pyspark
我正在尝试比较 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),
....
Run Code Online (Sandbox Code Playgroud)
数据框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),
....
Run Code Online (Sandbox Code Playgroud)
当我这样做时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)
Run Code Online (Sandbox Code Playgroud)
假设字段的顺序相同,您可以访问架构中每个字段的 和 并将它们压缩以进行比较name:dataType
print(
all(
(a.name, a.dataType) == (b.name, b.dataType)
for a,b in zip(df_A.schema, df_B.schema)
)
)
#True
Run Code Online (Sandbox Code Playgroud)
如果它们的顺序不同,您可以比较排序后的字段:
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
Run Code Online (Sandbox Code Playgroud)
如果两个 DataFrame 可能具有不同的列数,您可以首先比较架构长度作为短路检查 - 如果失败,则不必遍历字段:
print(len(df_A.schema) == len(df_B.schema))
#True
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1886 次 |
| 最近记录: |