如何使用pyspark中的窗口应用重新分区?

如何使用pyspark中的窗口应用重新分区?,pyspark,Pyspark,我有一列Foo,其中包含double值,例如: [ 100.4, 39.6, 98.2, 10.8, 62.1, 69.6 … ] 我想使用10窗口重新分区,该窗口将生成类似以下内容的数据集: Foo=10 Foo=20 Foo=30 Foo=40 Foo=50 Foo=60 Foo=70 Foo=80 Foo=90 Foo=100 Foo=110 使用repartiton(number:int,colname:str)将数据帧拆分为给定的number文件。但是我不能选择窗口 那么如何在py

我有一列
Foo
,其中包含
double
值,例如:

[ 100.4, 39.6, 98.2, 10.8, 62.1, 69.6 … ]
我想使用
10
窗口重新分区,该窗口将生成类似以下内容的数据集:

Foo=10
Foo=20
Foo=30
Foo=40
Foo=50
Foo=60
Foo=70
Foo=80
Foo=90
Foo=100
Foo=110
使用
repartiton(number:int,colname:str)
将数据帧拆分为给定的
number
文件。但是我不能选择窗口

那么如何在pyspark中实现呢


谢谢

我不确定你所说的重新划分是什么意思,但在任何情况下,假设你有一个
df

+-----+
|  Foo|
+-----+
|100.4|
| 39.6|
| 98.2|
| 10.8|
| 62.1|
| 69.6|
+-----+
您可以轻松地将您的值四舍五入:

从pyspark.sql.functions导入col,floor
df2=df.带柱('Foo_bined',地板(柱('Foo')/10)*10)
如果这是您要查找的结果,则可以仅选择/重命名新列。您也可以根据自己的要求更改舍入方法(
floor
round
ceil

如果通过重新分区,您确实希望根据bucketing到10的大小将值物理保存到不同的文件夹中,则可以运行:

df2.write.partitionBy('Foo_binned').csv('./foos.csv')
将在保存时对数据进行分区:

30.03.2020  23:05                 8 ._SUCCESS.crc
30.03.2020  23:05    <DIR>          Foo_binned=10
30.03.2020  23:05    <DIR>          Foo_binned=100
30.03.2020  23:05    <DIR>          Foo_binned=30
30.03.2020  23:05    <DIR>          Foo_binned=60
30.03.2020  23:05    <DIR>          Foo_binned=90
30.03.2020  23:05                 0 _SUCCESS

分区数量8

我不确定重新分区是什么意思,但在任何情况下,假设您的df为:

+-----+
|  Foo|
+-----+
|100.4|
| 39.6|
| 98.2|
| 10.8|
| 62.1|
| 69.6|
+-----+
您可以轻松地将您的值四舍五入:

从pyspark.sql.functions导入col,floor
df2=df.带柱('Foo_bined',地板(柱('Foo')/10)*10)
如果这是您要查找的结果,则可以仅选择/重命名新列。您也可以根据自己的要求更改舍入方法(
floor
round
ceil

如果通过重新分区,您确实希望根据bucketing到10的大小将值物理保存到不同的文件夹中,则可以运行:

df2.write.partitionBy('Foo_binned').csv('./foos.csv')
将在保存时对数据进行分区:

30.03.2020  23:05                 8 ._SUCCESS.crc
30.03.2020  23:05    <DIR>          Foo_binned=10
30.03.2020  23:05    <DIR>          Foo_binned=100
30.03.2020  23:05    <DIR>          Foo_binned=30
30.03.2020  23:05    <DIR>          Foo_binned=60
30.03.2020  23:05    <DIR>          Foo_binned=90
30.03.2020  23:05                 0 _SUCCESS

分区8的编号

添加到Daniel的回答中

+-----+----------+
|  Foo|Foo_binned|
+-----+----------+
|100.4|       100|
| 39.6|        30|
| 98.2|        90|
| 10.8|        10|
| 62.1|        60|
| 69.6|        60|
+-----+----------+
这将确保对于每个foo范围,您将获得1个文件。

from pyspark.sql import functions as F
n = df.select(F.col('Foo_binned')).distinct().count()

data.repartition(n)\
     .write \
     .partitionBy("Foo_binned")\
     .csv(path)

添加到丹尼尔的回答中

+-----+----------+
|  Foo|Foo_binned|
+-----+----------+
|100.4|       100|
| 39.6|        30|
| 98.2|        90|
| 10.8|        10|
| 62.1|        60|
| 69.6|        60|
+-----+----------+
这将确保对于每个foo范围,您将获得1个文件。

from pyspark.sql import functions as F
n = df.select(F.col('Foo_binned')).distinct().count()

data.repartition(n)\
     .write \
     .partitionBy("Foo_binned")\
     .csv(path)

你想根据窗口写入不同的文件吗?是否在写入之前使用window将列放入重新分区功能?是的,我想基于window写入不同的文件您想基于window写入不同的文件?喜欢在写之前使用window将列放入重新分区功能吗?是的,我想基于window写入不同的文件谢谢daniel,我使用了单词
重新分区
来实现目标:谢谢daniel,我使用了单词
重新分区
来实现目标: