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

jfewjypa  于 2021-07-14  发布在  Spark
关注(0)|答案(2)|浏览(307)

我是根据列的值按数据集分组的 mynewmeancol2 如下所示:

dF.select("col0","col1","col2","col3","col4").where("col1> mynewmeancol2")
.withColumn("avgCol1", avg("col1").over(Window.partitionBy("col0", "col1")))

我想知道如何传递一个列名数组(表示字符串列表)(而不仅仅是 col0 & col1 )至 partitionBy ?
编辑:我看到里面有这样的东西 partitionBy :

partitionsColumnsList.map(col(_)):_*)

会在斯卡拉工作。但我需要它是java的。
谢谢

9fkzdhlc

9fkzdhlc1#

是的,你可以 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|

# +---+----+---+
vltsax25

vltsax252#

这是你如何通过,而不是 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()]));

相关问题