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

withColumn()中的PySpark list()只工作一次,那么AssertionError:col应该是Column,pyspark,Pyspark,我有一个数据帧,它有6个字符串列,分别命名为'Spclty1'…'Spclty6'和'StartDt1'…'StartDt6'。我想将它们压缩并折叠成如下列: [[Spclty1,StartDt1]…[Spclty6,StartDt6]] 我首先尝试将“Spclty”列折叠成如下列表: DF = DF.withColumn('Spclty', list(DF.select('Spclty1', 'Spclty2', 'Spclty3', 'Spclty4', 'Spclty5', 'Spclty

我有一个数据帧,它有6个字符串列,分别命名为'Spclty1'…'Spclty6'和'StartDt1'…'StartDt6'。我想将它们压缩并折叠成如下列:
[[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”…“StartDt6”:

DF = DF.withColumn('StartDt', list(DF.select('StartDt1', 'StartDt2', 'StartDt3', 'StartDt4', 'StartDt5', 'StartDt6'))))
这导致断言错误:列应为列

在我尝试的东西用完后,我再次尝试了原始操作(作为一种理智检查):

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


因此,最好理解为什么它只在第一次(仅)起作用,但主要问题是:在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()
构造就是我要寻找的,而
数组([struct(…)])
方法让我可以将'Spclty'和'StartDt'项合并到一个类似dict的元素列表中。

谢谢。在阅读了大量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()
构造就是我要找的,而
数组([struct(…)])
方法让我可以将'Spclty'和'StartDt'项合并到一个类似dict的元素列表中。

您是否尝试将结果数据框保存到两个不同的变量名中。例如:
DF_-Spclty=DF_-tmp.withColumn('Spclty',list(DF_-tmp.select('Spclty1','Spclty2','Spclty3','Spclty4','Spclty5','Spclty6'))
DF_-StartDt=DF_-tmp.withColumn('StartDt',list(DF_-tmp.select('StartDt1','StartDt2','StartDt3','start4','start4','start5','start6')))
我想你可能已经弄明白了为什么我只让它工作了一次——“Spclty”列在第一次之后就存在了,重复执行是为了创建一个重复的列名?(我想
withColumn()
会覆盖旧的,)您是否尝试将结果数据帧保存到两个不同的变量名中。例如:
DF_-Spclty=DF_-tmp.withColumn('Spclty',list(DF_-tmp.select('Spclty1','Spclty2','Spclty3','Spclty4','Spclty5','Spclty6'))
DF_-StartDt=DF_-tmp.withColumn('StartDt',list(DF_-tmp.select('StartDt1','StartDt2','StartDt3','start4','start4','start5','start6')))
我想你可能已经弄明白了为什么我只让它工作了一次——“Spclty”列在第一次之后就存在了,重复执行是为了创建一个重复的列名?(我以为
withColumn()
会覆盖旧的,)