сравнить схему, игнорируя обнуляемый - PullRequest
0 голосов
/ 30 мая 2018

Я пытаюсь сравнить схему 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),
....

Когда яdo df_A.schema == df_B.schema, результат, если False, очевидно.Но я бы хотел игнорировать параметр «nullable», будь то false или true, если структура одинакова, он должен вернуть True.

Возможно ли это?

1 Ответ

0 голосов
/ 30 мая 2018

Используя ваш пример следующих двух схем 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)

и предполагая, что поля расположены в одинаковом порядке, вы можете получить доступ к name и dataType каждого из полей всхемы и заархивируйте их для сравнения:

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

Если возможно, что два кадра данных могутИмея различное количество столбцов, вы можете сначала сравнить длины схемы как проверку на короткое замыкание - если это не удастся, не пытайтесь перебирать поля:

print(len(df_A.schema) == len(df_B.schema))
#True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...