我有以下格式的火花資料框:
-------------------- --------------------
| profiles|__record_timestamp__|
-------------------- --------------------
|[0, 1, 1, 1, 3, 1...| 1651737406300000000|
|[1, 0, 1, 2, 1, 0...| 1651736986300000000|
|[2, 1, 3, 1, 0, 0...| 1651737232300000000|
|[1, 1, 3, 1, 2, 0...| 1651737352300000000|
|[0, 1, 0, 0, 0, 1...| 1651737412300000000|
|[0, 1, 0, 1, 1, 1...| 1651737142300000000|
|[3, 1, 0, 1, 1, 1...| 1651737574300000000|
|[2, 0, 3, 1, 0, 1...| 1651737178300000000|
|[0, 0, 0, 1, 2, 1...| 1651737364300000000|
|[0, 0, 1, 0, 0, 0...| 1651737280300000000|
|[1, 0, 0, 1, 0, 0...| 1651737196300000000|
|[0, 0, 0, 0, 0, 1...| 1651737436300000000|
|[8, 2, 0, 0, 0, 3...| 1651737166300000000|
|[4, 0, 1, 2, 0, 0...| 1651737538300000000|
|[1, 2, 0, 1, 1, 0...| 1651737052300000000|
|[1, 3, 0, 1, 0, 1...| 1651737082300000000|
|[1, 1, 1, 2, 0, 0...| 1651737100300000000|
|[1, 0, 0, 0, 1, 0...| 1651736980300000000|
|[1, 1, 0, 0, 0, 0...| 1651737040300000000|
|[1, 0, 1, 0, 1, 1...| 1651737004300000000|
-------------------- --------------------
only showing top 20 rows
組態檔中的陣列長 91260。我需要先將其重塑為 90*1024 陣列,然后我計劃展開,每個陣列都有一個 0-89 的整數匹配它在原始陣列中的位置。
任何想法如何做到這一點?f.explode() 每列只會給我 1 個元素, split() 似乎只適用于字串,我找不到 reshape 或 array_split() 函式或任何東西。TIA
uj5u.com熱心網友回復:
您可以通過創建所需切片的陣列然后使用posexplode函式來實作。為了實用性,我創建了一個較小的 df 來展示它是如何作業的
import pyspark.sql.functions as F
from pyspark.sql import Row
SPLIT_COUNT = 3
SPLIT_SIZE = 5
ARRAY_SIZE = SPLIT_COUNT * SPLIT_SIZE
df = spark.createDataFrame([
Row(profiles=list(range(ARRAY_SIZE)), timestamp=12345)
])
slices = [F.slice(F.col('profiles'), i * SPLIT_SIZE 1, SPLIT_SIZE) for i in range(SPLIT_COUNT)]
df.select(
F.posexplode(F.array(*slices)),
F.col('timestamp')
).show()
--- -------------------- ---------
|pos| col|timestamp|
--- -------------------- ---------
| 0| [0, 1, 2, 3, 4]| 12345|
| 1| [5, 6, 7, 8, 9]| 12345|
| 2|[10, 11, 12, 13, 14]| 12345|
--- -------------------- ---------
uj5u.com熱心網友回復:
我認為您正在尋找的是poseexplode:
from pyspark.sql import Row eDF = spark.createDataFrame([Row(a=1, intlist=[1,2,3], mapfield={"a": "b"})]) eDF.select(posexplode(eDF.intlist)).collect() [Row(pos=0, col=1), Row(pos=1, col=2), Row(pos=2, col=3)]
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/474828.html
下一篇:從Maven存盤庫下載jar檔案
