#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()