Использование join
(в случае связей это приведет к более чем одной строке в группе):
import pyspark.sql.functions as F
from pyspark.sql.functions import count, col
cnts = df.groupBy("id_sa", "id_sb").agg(count("*").alias("cnt")).alias("cnts")
maxs = cnts.groupBy("id_sa").agg(F.max("cnt").alias("mx")).alias("maxs")
cnts.join(maxs,
(col("cnt") == col("mx")) & (col("cnts.id_sa") == col("maxs.id_sa"))
).select(col("cnts.id_sa"), col("cnts.id_sb"))
Использование оконных функций (приведет к удалению связей):
from pyspark.sql.functions import row_number
from pyspark.sql.window import Window
w = Window().partitionBy("id_sa").orderBy(col("cnt").desc())
(cnts
.withColumn("rn", row_number().over(w))
.where(col("rn") == 1)
.select("id_sa", "id_sb"))
Использование порядка struct
:
from pyspark.sql.functions import struct
(cnts
.groupBy("id_sa")
.agg(F.max(struct(col("cnt"), col("id_sb"))).alias("max"))
.select(col("id_sa"), col("max.id_sb")))
См. также Как выбрать первую строку каждой группы?
<%@ page import="com.myproject.MyService" %>
<%
def myService = grailsApplication.classLoader.loadClass('com.myproject.MyService').newInstance()
%>
И тогда вы можете вызвать ${myService.method()}
в своем представлении gsp
Имейте в виду, что вызов транзакционных методов обслуживания из представлений снижает производительность. Лучше перенести все вызовы методов транзакционного обслуживания на контроллер (если вы можете)
Лучше всего использовать библиотеку тегов, поскольку создание экземпляра службы непосредственно в представлении через загрузчик классов НЕ БУДЕТ автоматически связывать другие объявленные службы, которые могут жить в службе, которую вы пытаетесь использовать.
Используя библиотеку тегов, вы будете автоматически подключать эти службы.
В вашем представлении gsp <g:customTag param1="$modelObjec" param2="someString" />
В вашей папке taglib (yourApp/grails-app/taglib/com/something/MyAppTagLib
):
package com.something
class MyAppTagLib {
def myService // This will be auto-wired
def customTag = { attribs ->
def modelObj = attribs['param1']
def someString = attribs['param2']
// Do something with the params
myService.method()
out << "I just used method of MyService class"
}
}
MyService:
package com.something
class MyService {
def anotherService // This will be auto-wired
def method() {
anotherService.anotherMethod()
}
}
Попробуйте - очень полезно
%{--Use BlogService--}%
<g:set var="blog" bean="blogService"/>
<ul>
<g:each in="${blog.allTitles()}" var="title">
<li>${title}</li>
</g:each>
</ul>
Также это не рекомендуемая вещь, вы всегда можете использовать taglib
Я думаю, что лучший способ сделать это:
<%
def myService = grailsApplication.mainContext.getBean("myService");
%>
Таким образом, вы получаете экземпляр службы, не теряя автоматические услуги.