Scala Spark столбцы DataFrame в виде карты и сравнить их с помощью Foldleft

Просто отредактируйте /etc/my.cnf Добавьте следующие строки в my.cnf

[mysqld]

socket=/var/lib/mysql/mysql.sock 

[client]

socket=/var/lib/mysql/mysql.sock

Перезапустите mysql и снова подключитесь

mysql -u user -p база данных паролей -h host;

-1
задан urvish patel 12 March 2019 в 20:31
поделиться

1 ответ

Проблема с вашим приложением foldLeft заключается в том, что оно не эквивалентно выражению, которое вы хотите использовать.

Как вы уже сказали, вы ищете

sha2(b, 256) = b_hash OR sha2(c, 256) = c_hash OR sha2(d, 256) = d_hash

, в то время как цепочечный фильтр на DataFrame приводит к

sha2(b, 256) = b_hash AND sha2(c, 256) = c_hash AND sha2(d, 256) = d_hash

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

import org.apache.spark.sql.functions.{col, lit}
import org.apache.spark.sql.Column

val atLeastOneMatch: Column = map.foldLeft(lit(false)) { 
  case (acc, (c, h)) => acc or (sha2(col(c), 256) === h) 
}

и затем использовать результат для фильтрации данных

df.filter(atLeastOneMatch).count

Это будет считать все строки , где хотя бы один столбец соответствует хешу предоставлено в map. По законам Де Моргана его отрицание

!atLeastOneMatch

будет эквивалентно

sha2(b, 256) != b_hash AND sha2(c, 256) != c_hash AND sha2(d, 256) = d_hash

Другими словами, оно будет соответствовать случаям, когда ни одно из значений не соответствует соответствующему хешу. [+1139]

Если вы хотите найти строки, в которых хотя бы одно значение не соответствует хешу , вам следует использовать

sha2(b, 256) != b_hash OR sha2(c, 256) != c_hash OR sha2(d, 256) != d_hash

, который можно составить, как показано ниже

[ 117]

Это отрицание

!atLeastOneMismatch

эквивалентно (законы де Моргана еще раз)

sha2(b, 256) = b_hash AND sha2(c, 256) = c_hash AND sha2(d, 256) = d_hash

и далее эквивалентно foldLeft с аккумулятором DataFrame и === . [тысяча сто сорок четыре]

Итак, подведем итог - если C является набором столбцов, то:

  • ∈c∈C map (c) = sha2 (c, 256) - atLeastOneMatch
  • ∀c∈C map (c)! = Sha2 (c, 256) - !atLeastOneMatch
  • ∃c∈C map ( c)! = sha2 (c, 256) - atLeastOneMismatch
  • ∀c∈C map (c) = sha2 (c, 256) - !atLeastOneMismatch [1131 ]
0
ответ дан user10958683 12 March 2019 в 20:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: