Я хочу разбить фрейм данных "df1" на 3 столбца.Этот фрейм данных имеет ровно 990 уникальных комбинаций для этих 3 столбцов:
In [17]: df1.createOrReplaceTempView("df1_view")
In [18]: spark.sql("select count(*) from (select distinct(col1,col2,col3) from df1_view) as t").show()
+--------+
|count(1)|
+--------+
| 990|
+--------+
Чтобы оптимизировать обработку этого фрейма данных, я хочу разделить df1, чтобы получить 990 секций, по одному на каждую ключевую возможность:
In [19]: df1.rdd.getNumPartitions()
Out[19]: 24
In [20]: df2 = df1.repartition(990, "col1", "col2", "col3")
In [21]: df2.rdd.getNumPartitions()
Out[21]: 990
Я написал простой способ подсчета строк в каждом разделе:
In [22]: def f(iterator):
...: a = 0
...: for partition in iterator:
...: a = a + 1
...: print(a)
...:
In [23]: df2.foreachPartition(f)
И я заметил, что на самом деле я получил 628 разделов с одним или несколькими значениями ключа и 362пустые разделы.
Я предполагал, что spark будет перераспределять равномерно (1 значение ключа = 1 раздел), но это не похоже на это, и я чувствую, что это перераспределение добавляет перекос данных, хотя это должно бытьнаоборот ...
Какой алгоритм использует Spark для разделения кадра данных на столбцы?Есть ли способ достичь того, что я считал возможным?
Я использую Spark 2.2.0 на Cloudera.