回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p><strong>我想做什么:</strong></p>
<p>在<strong>PySpark</strong>中,我试图<strong>将N行分配到X个大小相同的组中,并<strong>为这些组指定一个特定的值D</strong></p>
<ul>
<li>每行由属性A、B、C(参考、项目、位置)组成
所有A都是唯一的,但不是B&;C</li>
<li>X是上游声明的常数</li>
<li>D是从D1=今天+1到Dx=今天+X的日期</li>
<li>组合{B;C}相等的行不应在
不同的组(不应拆分同一位置的相同项目
并获得相同的日期)</li>
</ul>
<hr/>
<p><strong>我拥有的(df1):</strong></p>
<pre><code>df1 = spark.createDataFrame([ ('1234','banana','Paris'),
('1235','orange','Berlin'),
('1236','orange','Paris'),
('1237','banana','Berlin'),
('1238','orange','Paris'),
('1239','banana','Berlin'),
], ["A","B","C"])
+----+------+------+
| A| B| C|
+----+------+------+
|1234|banana| Paris|
|1235|orange|Berlin|
|1236|orange| Paris|
|1237|banana|Berlin|
|1238|orange| Paris|
|1239|banana|Berlin|
+----+------+------+
</code></pre>
<p><strong>我想要什么(df2):</strong></p>
<p><em>例如,当X=3时:</em></p>
<pre><code> +----+------+------+-----+
| A| B| C| D|
+----+------+------+-----+
|1234|banana| Paris|date1|
|1235|orange|Berlin|date1|
|1236|orange| Paris|date2|
|1237|banana|Berlin|date3|
|1238|orange| Paris|date2|
|1239|banana|Berlin|date3|
+----+------+------+-----+
</code></pre>
<p><em>例如,当X=4时:</em></p>
<pre><code> +----+------+------+-----+
| A| B| C| D|
+----+------+------+-----+
|1234|banana| Paris|date1|
|1235|orange|Berlin|date4|
|1236|orange| Paris|date2|
|1237|banana|Berlin|date3|
|1238|orange| Paris|date2|
|1239|banana|Berlin|date3|
+----+------+------+-----+
</code></pre>
<p><em>例如,当X=5时:</em></p>
<pre><code> +----+------+------+-----+
| A| B| C| D|
+----+------+------+-----+
|1234|banana| Paris|date1|
|1235|orange|Berlin|date4|
|1236|orange| Paris|date2|
|1237|banana|Berlin|date3|
|1238|orange| Paris|date2|
|1239|banana|Berlin|date3|
+----+------+------+-----+
</code></pre>
<p>注:{B,C}元素的排序可以是随机的</p>
<hr/>
<p><strong>到目前为止我所尝试的:</strong></p>
<p>下面的代码平均分配元素,但不能满足不拆分类似{B;C}组合的条件</p>
<pre><code>>>> w=Window.orderBy('B','C')
>>> df2 = df1.withColumn("id",(F.row_number().over(w))%3)
>>> df2.show()
+----+------+------+---+
| A| B| C| id|
+----+------+------+---+
|1237|banana|Berlin| 1|
|1239|banana|Berlin| 2|
|1234|banana| Paris| 0|
|1235|orange|Berlin| 1|
|1236|orange| Paris| 2|
|1238|orange| Paris| 0|
+----+------+------+---+
</code></pre>
<hr/>