[英]Spark Group By and with Rank function is running very slow
我正在編寫一個用於在一個時間范圍內查找訪問的前n個URL的spark應用。 但是,此作業可以繼續運行,並且在一個實例中的ES中需要花費數小時來處理389451
條記錄。 我想減少這個時間。
我正在從彈性搜索中讀取波紋
val df = sparkSession.read
.format("org.elasticsearch.spark.sql")
.load(date + "/" + business)
.withColumn("ts_str", date_format($"ts", "yyyy-MM-dd HH:mm:ss")).drop("ts").withColumnRenamed("ts_str", "ts")
.select(selects.head, selects.tail:_*)
.filter($"ts" === ts)
.withColumn("url", split($"uri", "\\?")(0)).drop("uri").withColumnRenamed("url", "uri").cache()
在上面的DF中,我正在從ElasticSearch中讀取和過濾。 我也從URI中刪除查詢參數。
然后我在做分組
var finalDF = df.groupBy("col1","col2","col3","col4","col5","uri").agg(sum("total_bytes").alias("total_bytes"), sum("total_req").alias("total_req"))
然后我正在運行窗口功能
val partitionBy = Seq("col1","col2","col3","col4","col5")
val window = Window.partitionBy(partitionBy.head, partitionBy.tail:_*).orderBy(desc("total_req"))
finalDF = finalDF.withColumn("rank", rank.over(window)).where($"rank" <= 5).drop("rank")
然后我正在將finalDF寫給cassandra
finalDF.write.format("org.apache.spark.sql.cassandra").options(Map("table" -> "table", "keyspace" -> "keyspace")).mode(SaveMode.Append).save()
我在ES群集中有4個數據節點,而我的Spark機器是16核64GB Ram VM。 請幫助我找到問題所在。
在讀取后保留數據幀可能是一個好主意,因為您將在排名函數中使用很多次。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.