withColumn()中的PySpark list()只工作一次,那么AssertionError:col应该是Col



我有一个DataFrame,它有6个字符串列,命名为"Spclty1"…'Spclty6'和另一个名为"StartDt1"的6…'起始Dt6'。我想把它们拉上拉链,折叠成一列,看起来像这样:[[Spclty1, StartDt1]...[Spclty6, StartDt6]]

我第一次尝试将"Spclty"列折叠成这样的列表:

DF = DF.withColumn('Spclty', list(DF.select('Spclty1', 'Spclty2', 'Spclty3', 'Spclty4', 'Spclty5', 'Spclty6')))

这在我第一次执行它时就起了作用,正如预期的那样,给了我一个名为"Spclty"的新列,其中包含['014', '124', '547', '000', '000', '000']等行。

然后,我在脚本中添加了一行,在一组不同的6个字符串列上做同样的事情,名为"StartDt1"起始Dt6':

DF = DF.withColumn('StartDt', list(DF.select('StartDt1', 'StartDt2', 'StartDt3', 'StartDt4', 'StartDt5', 'StartDt6'))))

这导致了CCD_ 3。

在我尝试的东西用完后,我再次尝试了原始操作(作为健全性检查(:

DF.withColumn('Spclty', list(DF.select('Spclty1', 'Spclty2', 'Spclty3', 'Spclty4', 'Spclty5', 'Spclty6'))).collect()

并得到如上所述的断言错误。

因此,最好能理解为什么它第一次(仅(起作用,但主要问题是:在Spark中将列压缩到dict类元素集合中的正确方法是什么?

.withColumn()需要一个列对象作为第二个参数,而您提供的是一个列表。

谢谢。在阅读了许多SO文章后,我找到了将一组列传递给col参数的语法,使用struct创建一个包含值列表的输出列:

DF_tmp = DF_tmp.withColumn('specialties', array([
struct(
*(col("Spclty{}".format(i)).alias("spclty_code"),
col("StartDt{}".format(i)).alias("start_date")) 
)
for i in range(1, 7)
]
))

因此,col()*col()构造正是我想要的,而array([struct(...)])方法允许我将"Spclty"one_answers"StartDt"条目组合到一个类似dict的元素列表中。

最新更新