【发布时间】:2023-03-22 02:24:01
【问题描述】:
我有一个如下图所示的数据框:
+-----+------------------------+
|Index| finalArray |
+-----+------------------------+
|1 |[0, 2, 0, 3, 1, 4, 2, 7]|
|2 |[0, 4, 4, 3, 4, 2, 2, 5]|
+-----+------------------------+
我想将数组分成 2 个块,然后找到每个块的总和并将结果数组存储在列 finalArray 中。如下所示:
+-----+---------------------+
|Index| finalArray |
+-----+---------------------+
|1 |[2, 3, 5, 9] |
|2 |[4, 7, 6, 7] |
+-----+---------------------+
我可以通过创建 UDF 来做到这一点,但需要寻找更好和优化的方法。如果我可以使用 withColumn 并传递 flagArray 来处理它,而不必编写 UDF,则最好。
@udf(ArrayType(DoubleType()))
def aggregate(finalArray,chunkSize):
n = int(chunkSize)
aggsum = []
final = [finalArray[i * n:(i + 1) * n] for i in range((len(finalArray) + n - 1) // n )]
for item in final:
agg = 0
for j in item:
agg += j
aggsum.append(agg)
return aggsum
我无法在 UDF 中使用以下表达式,因此我使用了循环
[sum(finalArray[x:x+2]) for x in range(0, len(finalArray), chunkSize)]
【问题讨论】:
标签: apache-spark pyspark apache-spark-sql pyspark-dataframes