Сравните две схемы (имя столбца + обнуляемый) в Spark - PullRequest
0 голосов
/ 07 мая 2018

Я знаю, как сравнивать два списка в Scala, используя zip + forall.

Мой вопрос: как мы сравниваем две DataFrame схемы? То есть мы хотим сопоставить имена столбцов с их нулевым свойством.

Моя идея - использовать хеш-карту для хранения {имя столбца: nullable} и выполнить сравнение. Я думаю, это работает, но есть ли другой идиоматический способ?

Ответы [ 2 ]

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

Сначала вам нужно получить элементы, которые вы хотите сравнить, как сказал Том Лаус в своем ответе:

val s1 = df1.schema.fields.map(f => (f.name, f.nullable))
val s2 = df2.schema.fields.map(f => (f.name, f.nullable))

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

s1.diff(s2).isEmpty

возвращает: true, если различий не найдено, иначе false

Считайте, что метод diffне возвращает разницы, если поле присутствует в одном списке, но отсутствует в другом.Поэтому вам может понадобиться добавить второе условие для сравнения длин

s1.diff(s2).isEmpty && s1.length == s2.length
0 голосов
/ 07 мая 2018

Вы можете использовать zip & forall, только если уверены, что количество столбцов и порядок одинаковы.Или я что-то упустил?

В любом случае, я думаю, что это был бы способ сделать это:

val s1 = df1.schema.fields.map(f => (f.name, f.nullable))
val s2 = df2.schema.fields.map(f => (f.name, f.nullable))

val res = s1 zip s2 forall {
  case ((f1, n1), (f2,n2)) => f1 == f2 && n1 ==  n2
}

Вы могли бы даже отсортировать s1 & s2, чтобы убедиться, что имена полейвыровняйте, но это все еще кажется хитрым.

В противном случае я бы использовал метод diff.Будьте внимательны.Отсутствующие поля, которые существуют в df2, игнорируются

val res = (s1 diff s2).length == 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...