我根据列 mynewmeancol2
的值按数据集分组,如下所示:
dF.select("col0","col1","col2","col3","col4").where("col1> mynewmeancol2")
.withColumn("avgCol1", avg("col1").over(Window.partitionBy("col0", "col1")))
我想知道如何传递一组 column NAMES (MEANS LIST OF STRING)(而不仅仅是 {{1} } & col0
) 到 col1
?
编辑:我在 partitionBy
中看到了类似的东西:
partitionBy
可以在 Scala 中工作。但我需要它在 JAVA 中。
谢谢
答案 0 :(得分:0)
这是你如何通过,而不是 Arrays.stream(df.columns())
你可以替换为字符串列表(列名)
List<Column> arrayList = Arrays.stream(df.columns())
.map(functions::col).collect(Collectors.toList());
WindowSpec window = Window.partitionBy(arrayList.toArray(new Column[arrayList.size()]));
答案 1 :(得分:-1)
是的,您可以unnest
数组并传递给partitionBy
子句。
Example:
Spark-Scala:
df.show()
//+---+----+
//| id|dept|
//+---+----+
//| 1| a|
//| 2| a|
//| 3| b|
//| 4| c|
//+---+----+
import org.apache.spark.sql.expressions.Window
val cols=df.columns
val w_spec=Window.partitionBy(cols.head,cols.tail:_*)
df.withColumn("cc",avg("id").over(w_spec)).show()
//+---+----+---+
//| id|dept| cc|
//+---+----+---+
//| 2| a|2.0|
//| 4| c|4.0|
//| 3| b|3.0|
//| 1| a|1.0|
//+---+----+---+
Pyspark:
df.show()
#+---+----+
#| id|dept|
#+---+----+
#| 1| a|
#| 2| a|
#| 3| b|
#| 4| c|
#+---+----+
from pyspark.sql import window
cols=df.columns
w_spec=Window.partitionBy(*[cols])
df.withColumn("cc",avg("id").over(w_spec)).show()
#+---+----+---+
#| id|dept| cc|
#+---+----+---+
#| 2| a|2.0|
#| 4| c|4.0|
#| 1| a|1.0|
#| 3| b|3.0|
#+---+----+---+