как получить доступ к СДР в другом СДР?

Добавьте соединение к подзапросу, который находит самую последнюю версию для каждой статьи:

SELECT e_c.*, c.name, j1.status, j1.version, j1.articleId, j1.title
FROM assetcategory AS c
INNER JOIN assetentries_assetcategories AS e_c 
    ON c.categoryId = e_c.categoryId AND c.name = 'news'
INNER JOIN assetentry AS e
    ON e.entryId = e_c.entryId
INNER JOIN journalarticle AS j1
    ON j1.resourcePrimKey = e.classPK AND
       e.classNameId = (SELECT classNameId FROM classname_
                   WHERE value = 'com.liferay.portlet.journal.model.JournalArticle') AND
       j.companyId = e.companyId
INNER JOIN
(
    SELECT articleId, MAX(version) AS max_version
    FROM journalarticle
    WHERE status = 0
    GROUP BY articleId
) j2
    ON j1.articleId = j2.articleId AND j1.version = j2.max_version;

Основная идея объединения в подзапрос, псевдоним, как j2 выше, заключается в том, что он ограничивает результат установленный только для самой последней версии каждой статьи. Нам необязательно изменять оставшуюся часть запроса.

0
задан bib 19 January 2019 в 12:03
поделиться

1 ответ

Сначала о решениях, которые вы предложили:
solution2 :
Никогда не собирайте rdd.
Если вы соберете rdd, это означает, что ваше решение не будет масштабируемым, или это означает, что вам не нужен rdd во-первых.
решение1 :
Аналогично ссылке на решение2, но с некоторыми исключениями, ваш случай не является одним из этих исключений.

Как уже упоминалось, «искровой» способ сделать это - использовать « join ».
Конечно, нет необходимости преобразовывать данные в искровой кадр.

Вот решение:

rdd1 = sc.parallelize([('a', 1), ('b', 2), ('c', 3), ('d', 4), ('e', 5)])
rdd2 = sc.parallelize([('aa', 1), ('bb', 2), ('cc', 3), ('dd', 4), ('ee', 5)])
rdd3 = sc.parallelize([(('a', 'aa'), 1), (('b', 'dd'), 8), (('e', 'aa'), 34), (('c', 'ab'), 23)])

print rdd3.map(lambda x: (x[0][0], (x[0][1], x[1])))\
.join(rdd1)\
.map(lambda x: (x[1][0][0], (x[0], x[1][0][1], x[1][1]))).join(rdd2)\
.filter(lambda x: x[1][0][1] > x[1][0][2] + x[1][1])\
.map(lambda x: ((x[1][0][0], x[0]), x[1][0][1]))\
.collect()

--> [(('b', 'dd'), 8), (('e', 'aa'), 34)]
0
ответ дан user3689574 19 January 2019 в 12:03
поделиться
Другие вопросы по тегам:

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