从PySpark DataFrame列中删除元素

从PySpark DataFrame列中删除元素,pyspark,Pyspark,我知道PySpark数据帧是不可变的,所以我想创建一个新的列,该列由应用于PySpark数据帧的现有列的转换产生。我的数据太大,无法使用collect() 该列是唯一整数列表(给定列表中不重复整数),例如: 上面是一个玩具示例,因为我的实际数据帧具有最大长度为52个唯一整数的列表。我想生成一个列,它遍历int列表并为每个循环删除一个元素。要删除的元素将是所有列表中唯一元素集合中的一个,在本例中为[1,2,3] 因此,对于第一次迭代: 删除元素1,使结果为: [] [2] [2,3] [2,3]

我知道PySpark数据帧是不可变的,所以我想创建一个新的列,该列由应用于PySpark数据帧的现有列的转换产生。我的数据太大,无法使用collect()

该列是唯一整数列表(给定列表中不重复整数),例如:

上面是一个玩具示例,因为我的实际数据帧具有最大长度为52个唯一整数的列表。我想生成一个列,它遍历int列表并为每个循环删除一个元素。要删除的元素将是所有列表中唯一元素集合中的一个,在本例中为
[1,2,3]

因此,对于第一次迭代:

删除元素1,使结果为:

[]
[2]
[2,3]
[2,3]
[1]
[1]
[1,3]
[3]
对于第二次迭代:

移除元素2,使结果为:

[]
[2]
[2,3]
[2,3]
[1]
[1]
[1,3]
[3]
等,并用元素3重复上述步骤

对于每一次迭代,我想将结果附加到原始PySpark数据帧,以对其运行一些查询,使用此“筛选”列作为原始数据帧的行过滤器


我的问题是,如何将PySpark数据帧的列转换为列表?我的数据集很大,因此
df.select('columnOfInList').collect()会导致内存问题(例如:
Kryo序列化失败:缓冲区溢出。可用:0,必需:1448662。若要避免此情况,请增加spark.kryoserializer.Buffer.max值。

df.toLocalIterator()将为循环返回迭代器

以下是pyspark文档中的一个示例:

>>从pyspark.sql.functions导入数组\u删除
>>>从pyspark.sql导入SparkSession,SQLContext
>>>sc=SparkContext.getOrCreate(SparkConf().setMaster(“local[*]))
>>>火花=火花会话(sc)
>>>df=spark.createDataFrame([([1,2,3,1,1],),([],)],['data']))
>>>df.select(array_remove(df.data,1)).collect()
[行(数组移除(数据,1)=[2,3]),行(数组移除(数据,1)=[])]
参考: