Построение матрицы различий в Spark

Исходный (и правильный) Ответ:

Вы можете использовать is() и проверить селектор :hover.

var isHovered = $('#elem').is(":hover"); // returns true or false

Пример: http: / /jsfiddle.net/Meligy/2kyaJ/3/

(Это работает только тогда, когда селектор соответствует максимальному элементу ONE).

.

Редактировать 1 (29 июня 2013 г.): (применимо только к jQuery 1.9.x, поскольку оно работает с 1.10+, см. следующий Редактировать 2)

Этот ответ был лучшим решением на время ответа на вопрос. Этот селектор «: hover» был удален с удалением метода .hover() в jQuery 1.9.x.

Интересно, что недавний ответ «allicarn» показывает, что можно использовать :hover в качестве селектора CSS (vs. Sizzle), когда вы префикс его с помощью селектора $($(this).selector + ":hover").length > 0, и, похоже, он работает!

Кроме того, плагин hoverIntent , упомянутый в другом ответе, также выглядит очень красивым.

Редактировать 2 (21 сентября 2013 г.): .is(":hover") works

Основываясь на другом комментарии, я заметил, что исходный способ, который я опубликовал, .is(":hover"), на самом деле все еще работает в jQuery, поэтому .

  1. Он работал в jQuery 1.7.x.
  2. Он перестал работать в 1.9.1, когда кто-то сообщил об этом мне, и все мы думали, что это связано с jQuery удалив псевдоним hover для обработки событий в этой версии.
  3. Он снова работал в jQuery 1.10.1 и 2.0.2 (возможно, 2.0.x), что говорит о том, что сбой в 1.9.x был ошибка или так не преднамеренное поведение, как мы думали в предыдущей точке.

Если вы хотите проверить это в q частности jQuery, просто откройте пример JSFidlle в начале этого ответа, измените желаемую версию jQuery и нажмите «Запустить».

Редактировать 3 (9 марта 2014 г.): он работает только тогда, когда последовательность jQuery содержит один элемент

Как показано @Wilmer в комментариях, у него есть скрипка, которая даже не работает против jQuery версий I и других, которые протестировали ее. Когда я попытался найти, что особенного в его случае, я заметил, что он пытался проверить несколько элементов за раз. Это метало Uncaught Error: Syntax error, unrecognized expression: unsupported pseudo: hover.

Итак, работая со своей скрипкой, это НЕ работает:

var isHovered = !!$('#up, #down').filter(":hover").length;

Пока это работает:

var isHovered = !!$('#up,#down').
                    filter(function() { return $(this).is(":hover"); }).length;

Он также работает с последовательностями jQuery, которые содержат один элемент, например, если исходный селектор соответствовал только одному элементу или вы вызывали .first() по результатам и т. Д.

Это также упоминается в моей JavaScript + Web Dev Tips & amp; Ресурсный бюллетень .

0
задан Sasank Annavarapu 27 February 2019 в 17:34
поделиться

1 ответ

Для этого кадра данных:

scala> val df = List((1, "yes", "high", "on" ), (2,  "no", "high", "off"), (3, "yes",  "low", "off") ).toDF("id", "a1", "a2", "a3")
df: org.apache.spark.sql.DataFrame = [id: int, a1: string ... 2 more fields]

scala> df.show
+---+---+----+---+
| id| a1|  a2| a3|
+---+---+----+---+
|  1|yes|high| on|
|  2| no|high|off|
|  3|yes| low|off|
+---+---+----+---+

Мы можем построить декартово произведение, используя crossJoin с самим собой. Тем не менее, имена столбцов будут неоднозначными (я не знаю, как легко справиться с этим). Чтобы подготовиться к этому, давайте создадим второй фрейм данных:

scala> val df2 = df.toDF("id_2", "a1_2", "a2_2", "a3_2")
df2: org.apache.spark.sql.DataFrame = [id_2: int, a1_2: string ... 2 more fields]

scala> df2.show
+----+----+----+----+
|id_2|a1_2|a2_2|a3_2|
+----+----+----+----+
|   1| yes|high|  on|
|   2|  no|high| off|
|   3| yes| low| off|
+----+----+----+----+

В этом примере мы можем получить комбинации путем фильтрации с использованием id < id_2.

scala> val xp = df.crossJoin(df2)
xp: org.apache.spark.sql.DataFrame = [id: int, a1: string ... 6 more fields]

scala> xp.show
+---+---+----+---+----+----+----+----+
| id| a1|  a2| a3|id_2|a1_2|a2_2|a3_2|
+---+---+----+---+----+----+----+----+
|  1|yes|high| on|   1| yes|high|  on|
|  1|yes|high| on|   2|  no|high| off|
|  1|yes|high| on|   3| yes| low| off|
|  2| no|high|off|   1| yes|high|  on|
|  2| no|high|off|   2|  no|high| off|
|  2| no|high|off|   3| yes| low| off|
|  3|yes| low|off|   1| yes|high|  on|
|  3|yes| low|off|   2|  no|high| off|
|  3|yes| low|off|   3| yes| low| off|
+---+---+----+---+----+----+----+----+


scala> val filtered = xp.filter($"id" < $"id_2")
filtered: org.apache.spark.sql.Dataset[org.apache.spark.sql.Row] = [id: int, a1: string ... 6 more fields]

scala> filtered.show
+---+---+----+---+----+----+----+----+
| id| a1|  a2| a3|id_2|a1_2|a2_2|a3_2|
+---+---+----+---+----+----+----+----+
|  1|yes|high| on|   2|  no|high| off|
|  1|yes|high| on|   3| yes| low| off|
|  2| no|high|off|   3| yes| low| off|
+---+---+----+---+----+----+----+----+

На данный момент проблема в основном решена. Чтобы получить финальную таблицу, мы можем использовать оператор when().otherwise() для каждой пары столбцов или UDF, как я сделал здесь:

scala> val dist = udf((a:String, b: String) => if (a != b) 1 else 0)
dist: org.apache.spark.sql.expressions.UserDefinedFunction = UserDefinedFunction(<function2>,IntegerType,Some(List(StringType, StringType)))

scala> val distinction = filtered.select($"id", $"id_2", dist($"a1", $"a1_2").as("a1"), dist($"a2", $"a2_2").as("a2"), dist($"a3", $"a3_2").as("a3"))
distinction: org.apache.spark.sql.DataFrame = [id: int, id_2: int ... 3 more fields]

scala> distinction.show
+---+----+---+---+---+
| id|id_2| a1| a2| a3|
+---+----+---+---+---+
|  1|   2|  1|  0|  1|
|  1|   3|  0|  1|  1|
|  2|   3|  1|  1|  0|
+---+----+---+---+---+
0
ответ дан Leonardo Herrera 27 February 2019 в 17:34
поделиться
Другие вопросы по тегам:

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