Прежде чем продолжить: Эта операция еще одна groupByKey
.
Не совсем сжатое или эффективное решение, но вы можете использовать UserDefinedAggregateFunction
, введенный в Spark 1.5.0:
object GroupConcat extends UserDefinedAggregateFunction {
def inputSchema = new StructType().add("x", StringType)
def bufferSchema = new StructType().add("buff", ArrayType(StringType))
def dataType = StringType
def deterministic = true
def initialize(buffer: MutableAggregationBuffer) = {
buffer.update(0, ArrayBuffer.empty[String])
}
def update(buffer: MutableAggregationBuffer, input: Row) = {
if (!input.isNullAt(0))
buffer.update(0, buffer.getSeq[String](0) :+ input.getString(0))
}
def merge(buffer1: MutableAggregationBuffer, buffer2: Row) = {
buffer1.update(0, buffer1.getSeq[String](0) ++ buffer2.getSeq[String](0))
}
def evaluate(buffer: Row) = UTF8String.fromString(
buffer.getSeq[String](0).mkString(","))
}
Пример использования:
val df = sc.parallelize(Seq(
("username1", "friend1"),
("username1", "friend2"),
("username2", "friend1"),
("username2", "friend3")
)).toDF("username", "friend")
df.groupBy($"username").agg(GroupConcat($"friend")).show
## +---------+---------------+
## | username| friends|
## +---------+---------------+
## |username1|friend1,friend2|
## |username2|friend1,friend3|
## +---------+---------------+
Вы также можете создать оболочку Python, как показано в Spark: как сопоставить Python с Scala или Java User Defined Functions?
На практике может быть быстрее извлечь RDD, groupByKey
, mkString
и перестроить DataFrame.
Вы можете получить аналогичный эффект, объединив collect_list
(Spark> = 1.6.0) с concat_ws
:
import org.apache.spark.sql.functions.{collect_list, udf, lit}
df.groupBy($"username")
.agg(concat_ws(",", collect_list($"friend")).alias("friends"))
Я могу быть, неправильно понял Ваш вопрос, но делает ниже не, работают на Вас?
Я нашел, что должен был использовать поддающееся растягиванию изображение для выполнения этого. Пример Apple UICatalog имеет одну или несколько цветных кнопок, которые оттянуты этим способом. Вы могли использовать их шаблонное изображение и повторно окрасить его для удовлетворения потребностям кнопки.
я не уверен в выполнении этого в Интерфейсном Разработчике, но я смог создать кнопку и использовать изображение для его содержания с помощью следующего кода:
downloadButton = [[UIButton alloc] initWithFrame:CGRectMake(36, 212, 247, 37)];
downloadButton.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
downloadButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentCenter;
[downloadButton setTitle:NSLocalizedStringFromTable(@"Download", @"Localized", nil) forState:UIControlStateNormal];
[downloadButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
[downloadButton setFont:[UIFont boldSystemFontOfSize:14.0]];
UIImage *newImage = [[UIImage imageNamed:@"greenButton.png"] stretchableImageWithLeftCapWidth:12.0f topCapHeight:0.0f];
[downloadButton setBackgroundImage:newImage forState:UIControlStateNormal];
[downloadButton addTarget:self action:@selector(downloadNewItem) forControlEvents:UIControlEventTouchDown];
downloadButton.backgroundColor = [UIColor clearColor];
[downloadDisplayView addSubview:downloadButton];
keremk был правильным, когда он сказал для изменения цвета фона 'представления', когда Вы нажали на кнопку и вошли в инспектора. Это изменяет небольшие углы в любой цвет, который Вы выбрали.
Установите свой тип кнопки на "пользовательский" в палитре атрибутов кнопки. Это даст Вам квадратную кнопку с любым цветом, который Вы выбрали для фона.
, Если Вы хотите кнопку, которая больше походит на традиционную кнопку, но имеет различный цвет Ваша попытка должен войти в некоторое программное обеспечение редактирования изображение и создать его (я использую фотошоп для пользовательских кнопок).
Выбирание цвета фона представления для округленной-rect кнопки не изменит цвет фона кнопки. Попытайтесь делать кнопку пользовательской кнопкой (первое выпадающее в инспекторе) и затем выбрать цвет фона. Вы получите желаемый эффект:)
Эта ссылка предлагает элегантное решение вашей проблемы ... http://www.cimgf.com/2010/ 01/28 / fun-with-uibuttons-and-core-animation-sizes /
Я решил эту проблему, создав собственную кнопку в фейерверке. Я нарисовал прямоугольник со скругленными углами примерно того размера, который хотел, с цветом заливки и границей, которые я хотел. Обрежьте холст и сохраните как PNG. В XCode добавьте файл в папку «Ресурсы». Вы можете использовать кнопку Custom в Интерфейсном Разработчике и указать изображение в качестве этого PNG. Он изменит размер по мере необходимости, поместит текст сверху и т. Д. Кривая углов может исказиться, если вам придется значительно изменить размер оригинала.
Я прочитал ваш вопрос к , требующему (как и я) программный способ установки цвета кнопки. Это вопиющее упущение в UIKit, и я не смог заставить работать недокументированный UIGlassButton.
Я решил это с помощью одного сегмента UISegmentedControl
, который позволяет вам установите tintColor
:
UISegmentedControl * btn = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObject:name]];
btn.momentary = YES;
btn.segmentedControlStyle = UISegmentedControlStyleBar;
btn.tintColor = color;
[btn addTarget:self action:@selector(action:) forControlEvents:UIControlEventValueChanged];
Обратите внимание, что свойства мгновенное
и segmentedControlStyle
имеют значение, и что изображение можно использовать вместо NSString *
name.
Растягиваемое изображение с заглушками отлично работает, если вы можете использовать ограниченный набор стандартных изображений, но это не соответствует требованиям! Например,
buttonImage = [[UIImage imageNamed:@"button.png"] stretchableImageWithLeftCapWidth:26 topCapHeight:16];
Чтобы сохранить округлую форму кнопки, как насчет использования
view.layer.cornerRadius = 8;
описанной здесь
http://github.com/dermdaly/ButtonMaker
Вы можете сгенерировать изображение UIbutton с помощью этого приложения... и установить его в качестве фонового изображения вашей кнопки
Решение Тима Джеймса (односегментный сегментированный элемент управления) работало для меня, когда мне требовалось простое «Сохранить Кнопка с приличным синим градиентным фоном. Я просто создал 2-сегментный элемент управления в наконечнике, настроил первый сегмент так, как я хотел, а затем программно удалил второй сегмент в -viewWillAppear, используя [mySegmentedControl removeSegmentAtIndex: 1 animated: NO]. Для моих целей «Мгновенный» должен был быть активным (отмечен галочкой) для первого сегмента сегментированного элемента управления в пере, а «Выбранный» не был активен ни для одного из сегментов. «Значение изменено» - это действие сегментированного элемента управления для подключения.