基于PySpark中另一个数据帧的值映射ArrayType列的值
我所拥有的:基于PySpark中另一个数据帧的值映射ArrayType列的值,pyspark,Pyspark,我所拥有的: | ids. |items |item_id|value|timestamp| +--------+--------+-------+-----+---------+ |[A,B,C] |1.0 |1 |5 |100 | |[A,B,D] |1.0 |2 |6 |90 | |[D] |0.0. |3 |7 |80 | |[C] |0.0. |4
| ids. |items |item_id|value|timestamp|
+--------+--------+-------+-----+---------+
|[A,B,C] |1.0 |1 |5 |100 |
|[A,B,D] |1.0 |2 |6 |90 |
|[D] |0.0. |3 |7 |80 |
|[C] |0.0. |4 |8 |80 |
+--------+--------+-------+-----+----------
我想要的是:
| ids |
+--------+
|[1,2,3] |
|[1,2,4] |
|[3] |
|[4] |
+--------+
有没有一种不爆炸的方法?谢谢你的帮助 您可以使用自定义项:
from pyspark.sql.functions import udf, col
from pyspark.sql.types import ArrayType
# Suppose this is the dictionary you want to map
map_dict = {'A':1, 'B':2,'C':3,'D':4}
def array_map(array_col):
return list(map(map_dict.get, array_col))
"""
If you prefer list comprehension, you can return [map_dict[k] for k in array_col]
"""
array_map_udf = udf(array_map, ArrayType())
df = df.withColumn("mapped_array", array_map_udf(col("ids")))
我想不出另一种方法,但是要得到一个并行化字典,您可以使用toJSON方法。这将需要对您拥有的参考df类型进行进一步处理:
import json
df_json = df.toJSON().map(lambda x: json.loads(x))
您必须编写一个udf如果您使用spark 2.4+@pault,您可以避免一个udf我如何避免一个udf?这需要将第二个数据帧带到内存中以创建映射。有什么方法可以避免吗?我想对一个非常大的数据集执行此操作。@justneedsomehelps我试图为您带来一个分布式词典,它需要进一步处理才能获得我提到的地图。但我没有你的df的可复制样本
import json
df_json = df.toJSON().map(lambda x: json.loads(x))