Просто отредактируйте /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;
blockquote>
Проблема с вашим приложением 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
является набором столбцов, то:
atLeastOneMatch
!atLeastOneMatch
atLeastOneMismatch
!atLeastOneMismatch
[1131 ]