Просто используйте concat_ws () с нулевым разделителем, который удалит массив состояний для простых элементов, а затем collect_set вернет вам массив в состояния. Проверьте это.
scala> val df = Seq( ("f1","l1","loy1",null,"s1"),("f1","l1","loy1","e1","s1"),("f2","l2","loy2","e2","s2"),("f2","l2","loy2","e3",null),("f1","l1",null,"e1","s3")).toDF("F","L","loy","email","state")
df: org.apache.spark.sql.DataFrame = [F: string, L: string ... 3 more fields]
scala> df.show(false)
+---+---+----+-----+-----+
|F |L |loy |email|state|
+---+---+----+-----+-----+
|f1 |l1 |loy1|null |s1 |
|f1 |l1 |loy1|e1 |s1 |
|f2 |l2 |loy2|e2 |s2 |
|f2 |l2 |loy2|e3 |null |
|f1 |l1 |null|e1 |s3 |
+---+---+----+-----+-----+
scala> val df2 = df.groupBy("F", "L", "Loy").agg(collect_set($"Email").alias("Email"), collect_set($"State").alias("State"))
df2: org.apache.spark.sql.DataFrame = [F: string, L: string ... 3 more fields]
scala> df2.show(false)
+---+---+----+--------+-----+
|F |L |Loy |Email |State|
+---+---+----+--------+-----+
|f1 |l1 |null|[e1] |[s3] |
|f2 |l2 |loy2|[e2, e3]|[s2] |
|f1 |l1 |loy1|[e1] |[s1] |
+---+---+----+--------+-----+
scala> df2.groupBy("F","L","email").agg(max('loy).as("loy"),collect_set(concat_ws("",'state)).as("state")).show
+---+---+--------+----+--------+
| F| L| email| loy| state|
+---+---+--------+----+--------+
| f2| l2|[e2, e3]|loy2| [s2]|
| f1| l1| [e1]|loy1|[s3, s1]|
+---+---+--------+----+--------+
scala>
// Allows chainable logging
// USAGE: $('#someDiv').hide().log('div hidden').addClass('someClass');
// Demo : http://jsbin.com/odeke
jQuery.log = jQuery.fn.log = function (msg) {
if ( window.console && window.console.log ) {
console.log("%s: %o", msg, this);
}
return this;
};
можно использовать это, чтобы видеть, существует ли селектор.
if($.exists('#mydiv')) { }
$.exists = function(selector) {
return ($(selector).length);
}
Плагин проверки является потрясающим. Используемый это в приложении MVC ASP.NET для динамичной проверки материала на клиенте, использующем ajax... даже, возвратило пользовательские сообщения об ошибках на основе пользовательского входа... очень прохладного.
http://plugins.jquery.com/ размещает весь способ плагинов, и больших и маленьких, и будет намного более всесторонним и полезным ресурсом, чем этот поток мог когда-либо быть, извините.
Просто ярлык для получения/устанавливания идентификатора элемента.
(function($) {
$.fn.id = function(newDOMID){
var $this = $(this);
if($this.attr('id')){
if(!newDOMID){
$this.id.getID($this);
}
else {
$this.id.setID($this,newDOMID);
}
}
else {
alert('The target no longer appears to be a part of the DOM!')
}
};
$.fn.id.getID = function($this){
return $this.attr('id');
};
$.fn.id.setID = function($this,newDOMID){
$this.attr('id',newDOMID);
return this
};
})(jQuery);
Это - jID на сайте плагинов jQuery.
Интерпретирует абсолютные URL-адреса на странице как внешние ссылки и устанавливает их для открытия в новой вкладке с понятным заголовком и классом для определенного стиля.
$("#content [href^='http']:not(a:has('img'))").each(function(){$(this).attr("target", "_blank").addClass("external").attr("title", "External Link to " + $(this).attr("href"))});
Быстрый и простой AJAX:
Следующее позволяет создавать якоря, подобные
<a href='http://www.google.com/' rel='#myselector' class='ajax' />
, которые выполняют запрос AJAX по URL-адресу href
и вставляют результат в первый элемент, определенный селектором в атрибуте привязки rel
.
// Allow hrefs with the class 'ajax' and a rel attribute set with a selector to load content via ajax into the selected element.
$('.ajax').unbind('click').click
(
function(e)
{
$($(this).attr('rel')).load($(this).attr("href"));
e.preventDefault();
}
);
ах Я немного отошел от первоначального вопроса, но если есть фрагмент "получить / установить идентификатор", тогда у меня есть код для создания уникальных идентификаторов:
$.increment = function (){
var me = arguments.callee;
if (!me.count) me.count = 0;
return ++me.count;
}
$.domToSelector = function (jq, options){
var selectors = [], i = 0; defaults = {}, opts = $.extend(defaults,options);
$(jq).each(function(){
var $node = $(this);
if ($node.attr('id')){
selectors[i] = '#'+$(this).attr('id');
}
else{
var customId = ''+new Date;
customId = customId.replace(/ /g, '').replace(/:/g, '').replace(/\+/g, '');
customId = customId+'_'+$.increment();
if (opts.prefix) customId = opts.prefix+customId;
$node.attr('id', customId);
selectors[i] = '#'+customId;
}
i++;
});
if (selectors.length == 1) selectors = selectors[0];
return selectors;
}
Расширение селекторов, т.е. написание ваших собственных селекторов. Вот пример для двоих:
$(document).ready(function(){
$.extend($.expr[':'], {
inputEmpty: inputEmpty,
inputNotEmpty: inputNotEmpty
});
});
function inputEmpty(el) {
return $(el).val() == "";
}
function inputNotEmpty(el) {
return $(el).val() != "";
}