Итак, сначала я должен был внести эту коррекцию в ваш RDD (который соответствует вашему фактическому выходу):
rdd = sc.parallelize([('X01',41,'US',3),
('X01',41,'UK',1),
('X01',41,'CA',2),
('X02',72,'US',4),
('X02',72,'UK',6),
('X02',72,'CA',7),
('X02',72,'XX',8)])
Как только я сделал эту коррекцию, это сделало трюк:
df.select($"ID", $"Age").groupBy($"ID").agg($"ID", first($"Age") as "Age")
.join(
df.select($"ID" as "usID", $"Country" as "C1",$"Score" as "US"),
$"ID" === $"usID" and $"C1" === "US"
)
.join(
df.select($"ID" as "ukID", $"Country" as "C2",$"Score" as "UK"),
$"ID" === $"ukID" and $"C2" === "UK"
)
.join(
df.select($"ID" as "caID", $"Country" as "C3",$"Score" as "CA"),
$"ID" === $"caID" and $"C3" === "CA"
)
.select($"ID",$"Age",$"US",$"UK",$"CA")
Не так элегантно, как ваш стержень, конечно.
Возможное решение могло состоять в том, чтобы использовать положительный взгляд позади :
(?<=n)n
Это дало бы Вам конечное положение:
, Как упомянуто Timothy Khouri , положительное предвидение более интуитивно
, я предпочел бы его предложению (?=nn)n
более простую форму:
(n)(?=(n))
, Который сослался бы первое положение строк, которые Вы хотите и получили бы второй n в группе (2) .
, Которая является так потому что:
, Таким образом, группа (1) и группа (2) получат любой 'n', представляет (даже если это - сложный regex).
Используя предвидение с группой фиксации работает, за счет создания Вашего regex, медленнее и более сложного. Альтернативное решение состоит в том, чтобы сказать Regex. Соответствие () метод, где следующая попытка соответствия должна начаться. Попробуйте это:
Regex regexObj = new Regex("nn");
Match matchObj = regexObj.Match(subjectString);
while (matchObj.Success) {
matchObj = regexObj.Match(subjectString, matchObj.Index + 1);
}
AFAIK, нет никакого чистого regex способа сделать это сразу (т.е. возврат трех получений, которые Вы запрашиваете без цикла).
Теперь, можно найти шаблон однажды, и цикл на поиске, запускающемся со смещения (найденный положением + 1). Должен объединить использование regex с простым кодом.
Большое [РЕДАКТИРОВАНИЕ], я - downvoted, когда я в основном сказал что показанный Jan...
[РЕДАКТИРУЮТ 2], Чтобы быть ясным: ответ Jan's лучше. Не более точный, но конечно более подробный, это имеет право быть выбранным. Я просто не понимаю, почему мой - downvoted, так как я все еще не вижу ничего неправильного в нем. Не грандиозное предприятие, просто раздражающее.