簡體   English   中英

在與Scala Spark中的DataFrame有關的過濾器函數中使用定義的值

[英]Using a defined value in a filter function concerning a DataFrame in Scala Spark

我試圖找到一個類似的問題,但是沒有找到任何相關的問題。我是Spark和Scala的新手,在處理特定案例時遇到了麻煩。

我有一個DataFrame如下:

+---+---+------------+
|src|dst|relationship|
+---+---+------------+
|  0|238|        41.0|
|  0|159|        46.0|
|238| 12|        36.0|
|  1|235|        44.0|
|  2|139|        50.0|
+---+---+------------+

我的問題是:(1)我想為src = 0獲得具有最低“關系”值的目的地,並且(2)重用此值。 我可以同時使用val j = orderedSrc.filter("src == 1").orderBy("relationship").select("dst").take(5)val h = j(0)(0)

在我的示例中,它將返回j: Array[org.apache.spark.sql.Row] = Array([238], [159])h: Any = 238

我的問題與(2)有關:

如何在上一個查詢中使用此h值? 看起來像val j = orderedSrc.filter("src==h").orderBy("relationship").select("dst").take(5)將返回Array[org.apache.spark.sql.Row] = Array([12])嗎?

在此先感謝您的幫助:-)!

正如@Lamanus所寫,解決方案是:

orderedSrc.filter($"src" === h).orderBy("relationship").select($"dst").take(5)

非常感謝!

您不需要在中間步驟中使用take (這不會擴展),而是使用聯接:

val df = Seq(
  (0,238,41.0),
  (0,159, 46.0),
  (238,12,36.0),
  (1, 235, 44.0),
  (2,139,50.0)
).toDF("src","dest","relationship")


val h = df.where($"src"===0)
  .select(min(struct($"relationship",$"dest")).as("min"))

df
  .join(h,df("src")===h("min.dest"),"leftsemi")
  .show()

+---+----+------------+
|src|dest|relationship|
+---+----+------------+
|238|  12|        36.0|
+---+----+------------+

或與窗口功能相同:

df
  .withColumn("selector",min(when($"src"===0,struct($"relationship",$"dest"))).over(Window.partitionBy()))
  .where($"src"===$"selector.dest")
  .drop($"selector")
  .show()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM