Я бы использовал это:
select t.*
from test as t
join
(select max(rev) as rev
from test
group by id) as o
on o.rev = t.rev
Подзапрос SELECT не слишком эффективен, но в предложении JOIN кажется полезным. Я не эксперт в оптимизации запросов, но я пробовал в MySQL, PostgreSQL, FireBird, и он работает очень хорошо.
Вы можете использовать эту схему в нескольких соединениях и с предложением WHERE. Это мой рабочий пример (решение идентично вашей задаче с таблицей «твердое»):
select *
from platnosci as p
join firmy as f
on p.id_rel_firmy = f.id_rel
join (select max(id_obj) as id_obj
from firmy
group by id_rel) as o
on o.id_obj = f.id_obj and p.od > '2014-03-01'
Его спрашивают на таблицах с подростками таких записей записей, и он занимает менее 0,01 секунды на самом деле не слишком сильная машина.
Я бы не использовал пункт IN (как упоминается выше). IN предоставляется для использования с короткими списками констант, а не как фильтр запросов, построенный на подзапросе. Это связано с тем, что подзапрос в IN выполняется для каждой отсканированной записи, которая может сделать запрос очень медленным.
zipWithIndex
- это то, что вам нужно здесь. Он отображает от RDD[T]
до RDD[(T, Long)]
путем добавления индекса во вторую позицию пары.
sample1
.zipWithIndex()
.map { case (line, i) => i.toString + ", " + line }
или с использованием строковой интерполяции (см. комментарий @ DanielC.Sobral)
sample1
.zipWithIndex()
.map { case (line, i) => s"$i, $line" }
Вызывая val sample1 = sc.textFile("data.txt")
, вы создаете новый RDD .
Если вам нужно только выход , вы можете попробовать использовать следующий код:
blockquote>
sample1.zipWithIndex().foreach(f => println(f._2 + ", " + f._1))
В основном, используя этот код, вы сделаете это:
- Используя
.zipWithIndex()
вернет новыйRDD[(T, Long)]
, где(T, Long)
является Tuple ,T
является предыдущим типом данных элементов RDD (java.lang.String
, я считаю), аLong
является индексом элемента в RDD.- Вы выполнили преобразование, теперь вам нужно сделать действие.
foreach
, в этом случае , очень хорошо подходит. Что в основном делает: он применяет ваше утверждение к каждому элементу в текущем RDD, поэтому мы просто вызываем быстро отформатированныйprintln
.