我正在尋找一種從一個 pyspark 資料框中添加列的方法,可以說這是 DF1:
| 第 1 列 |
|---|
| 123 |
| 234 |
| 345 |
到另一個 pyspark 資料框,它本身將有任意數量的列,但沒有column1,DF2:
| 第 2 列 | 第 3 列 | 第 4 列 |
|---|---|---|
| 000 | 資料 | 一些1 |
| 253774 | ETC | ETC |
| 1096 | 無效的 | 更多的 |
| 999 | 其他 | 無效的 |
這里需要注意的是,我想避免使用 Pandas,并且如果可能的話,我想避免將所有資料拉到一個磁區中。這將在 DF2 端達到 TB 級的資料,它將在 EMR 集群上分布運行。
DF1 將是一組固定的數字,可能多于或少于 DF2 的行數。如果 DF2 有更多行,則應重復 DF1 值(思考回圈)。如果 DF1 有更多行,我們不會超過 DF2 中的行,我們只需為每一行附加一個值(如果我們包含 DF1.1 中的所有行無關緊要)
如果這些要求看起來很奇怪,那是因為值本身在 DF1 中很重要,我們需要在 DF2 中使用它們,但是將 DF1 中的哪個值附加到每個 DF2 行并不重要(我們只是不想重復一遍又一遍的相同值,盡管有些重復很好)
我試過的:
- 我嘗試向每個添加一個 row_number 以加入資料幀,但是當 DF2 大于 DF1 時,我們遇到了一個問題。
- 我嘗試復制 DF1 x次數以使其大到足以加入給定 row_number 的 DF2,但這在 EMR 上遇到了 java 堆空間問題。
我希望找到什么:
我正在尋找一種方法來簡單地回圈來自 DF1 的值并將它們應用于 DF2 上的每一行,但如果可能的話,使用本機 Pyspark 進行。
最后一個例子看起來像這樣:
| 第 1 列 | 第 2 列 | 第 3 列 | 第 4 列 |
|---|---|---|---|
| 123 | 000 | 資料 | 一些1 |
| 234 | 253774 | ETC | ETC |
| 345 | 1096 | 無效的 | 更多的 |
| 123 | 999 | 其他 | 無效的 |
uj5u.com熱心網友回復:
視窗函式的組合row_number可能ntile是答案:
在 DF1 上應用 a
row_number以獲取列舉為新列的所有記錄id獲取 DF1 中的記錄數并將其存盤為
df1_count應用于
ntile(df1_count)DF2 作為新列id。Ntile 會將您的 DF2 行“拆分”為 n 盡可能相等的組在新生成的列上加入 DF1 和 DF2
id以組合兩個資料框
或者,ntile(n)DF2 也可以獲得一個row_number()基礎列,而不是 ,id然后可以使用該列來計算 mod:
df.withColumn("id_mod", col("id") % lit(df1_count))
然后id_mod將其與 DF1 使用DF1.id
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/510794.html
