df1.show()
+---------+
|Data_Type|
+---------+
|   string|
|   string|
|      int|
+---------+
df2.show()
+---------+
|Data_Type|
+---------+
|   string|
|   string|
|      int|
+---------+

Я хочу сравнить (проверка на равенство) столбцы в df1 со строками в df2 ["Column_name"].

Я попытался сравнить их с помощью объединений, т.е.

df1.join(df2,on="Data_Type",how="left").join(df2,on="Data_Type",how="right")
if(df3.count() == df1.count() == df2.count()):
    print(True)

Но это не работает, так как у меня есть повторяющиеся значения в столбце «Data_Type», и я получаю выходной результат в виде перекрестного продукта после объединения, как показано ниже:

+---------+
|Data_Type|
+---------+
|      int|
|   string|
|   string|
|   string|
|   string|
|   string|
|   string|
|   string|
|   string|
+---------+

Есть ли другой способ проверить равенство на данных?

1
Chins Kuriakose 27 Апр 2020 в 12:21

2 ответа

Лучший ответ

Используйте exceptAll (сохраняет дубликаты) (или) subtract в искре.

df1.show()
#+---------+
#|Data_Type|
#+---------+
#|   string|
#|   string|
#|      int|
#+---------+


df2.show()
#+---------+
#|Data_Type|
#+---------+
#|   string|
#|   string|
#|      int|
#+---------+

df1.exceptAll(df2).count()
df2.exceptAll(df1).count()
#0
df1.subtract(df2).count()
df2.subtract(df1).count()
#0
0
Shu 27 Апр 2020 в 13:21

Надеюсь, у вас все хорошо в эти смутные времена!

Вы можете попробовать вычитание двух фреймов данных после их преобразования в наборы. Таким образом, вы можете преобразовать результат в массив данных.

    lst = []
    for row in set(df1.collect()) - set(df2.collect()):
         lst.append(row)
    spark.createDataFrame(lst)

Кроме того, поскольку мы используем наборы, если у вас есть более одного столбца, порядок не имеет значения в обоих кадрах данных.

Надеюсь это поможет!

1
sowjanya 28 Апр 2020 в 04:52