我有一个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的元素列表中。