如何将字符串数组传递给 PartitionBy

时间:2021-04-22 20:20:19

标签: apache-spark

我根据列 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 中。

谢谢

2 个答案:

答案 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|
#+---+----+---+
相关问题