如何使用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,我使用了单词重新分区
来实现目标: