基于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))