сравнение схемы pyspark с использованием dataframe.schema И dataframe.printSchema()

#apache-spark #types #pyspark #apache-spark-sql #pyspark-dataframes

#apache-spark #типы #apache-spark-sql #pyspark

Вопрос:

Я столкнулся с проблемой при попытке сравнить схему двух фреймов данных pyspark.

Если я использую df1.schema == df2.schema , он иногда возвращается True , но иногда возвращается False (я уверен, что схемы совпадают)

Однако, когда я использую df1.printSchema() == df2.printSchema() , вывод всегда True .

Я знаю, что тип данных df.schema — pyspark.sql.types.StructType, но почему это иногда дает НЕПРАВИЛЬНЫЙ результат сравнения? это ошибка в pyspark?

Комментарии:

1. По сути, df1.printSchema() возвращает None , поэтому вы не проводите значимого сравнения. Он вернет, True даже если ваша схема не соответствует. Посмотрите на рассматриваемые фреймы данных еще раз, действительно ли они одинаковы? Поделитесь некоторыми данными, поделитесь некоторым кодом.

Ответ №1:

Вы можете использовать следующую команду. Здесь также указано, какие столбцы отличаются, и это аккуратно и чисто

 set(df1.schema).symmetric_difference(set(df2.schema))
  

Ответ №2:

Если вы используете pyspark

получить dtypes из каждого фрейма данных, который вернул бы List[(column_name, data_type)]

И сравните вот так :

 for idx1,el1 in enumerate(df1.dtypes):
    for idx2,el2 in enumerate(df2.dtypes):
        if idx1 == idx2:
            if el1[0] == el2[0] and el1[1] == el2[1]:
                continue
            else:
                raise ValueError("Schema Don't Match for Col {0} and {1}".format(el1[0],el2[0]))
  

Ответ №3:

По моему опыту, df1.schema == df2.schema не дает желаемых интуитивных результатов.

Вы можете попробовать преобразовать схему в строку, а затем выполнить сравнение:

df1.schema.simpleString() == df2.schema.simpleString()