Я не уверен, что вы подразумеваете под перераспределением, но в любом случае, если у вас есть df
из:
+-----+
| Foo|
+-----+
|100.4|
| 39.6|
| 98.2|
| 10.8|
| 62.1|
| 69.6|
+-----+
Вы можете легко округлить значения:
from pyspark.sql.functions import col, floor
df2 = df.withColumn('Foo_binned', floor(col('Foo') / 10) * 10)
+-----+----------+
| Foo|Foo_binned|
+-----+----------+
|100.4| 100|
| 39.6| 30|
| 98.2| 90|
| 10.8| 10|
| 62.1| 60|
| 69.6| 60|
+-----+----------+
Если это результат, который вы ищете, вы можете выбрать / переименовать только новый столбец. Вы также можете просто изменить метод округления в зависимости от ваших требований (floor
, round
, ceil
).
Если при перераспределении вы действительно хотите физически сохранить значения в разных папках на основе Если разбить на 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
И последнее, но не менее важное, если вы просто хотите, чтобы данные в памяти были разделены этих ведер довольно сложно достичь, потому что, ну, вы не должны этого делать. Spark включает в себя механизм оптимизации, который будет работать лучше, если вы просто дадите ему
df = spark.createDataFrame([ (100.2,), (100.1,), (100.7,), (100.4,), (39.6, ), (39.6, ), (39.6, ), (39.6, ), (98.2, ), (10.8, ), (10.2, ), (10.8, ), (10.8, ), (62.1, ), (69.6, )], ['Foo'])
df2 = df.repartitionByRange('Foo')
print('No of partitions', df2.rdd.getNumPartitions())
No of partitions 8