PySpark 2.4:类型错误:列不可迭代(使用 F.col())

NYC*_*yes 2 python apache-spark apache-spark-sql pyspark

以下给了我一个TypeError: Column is not iterable例外:

from pyspark.sql import functions as F

df = spark_sesn.createDataFrame([Row(col0 = 10,
                                     col2 = 'ten',
                                     col3 = 10.0),])

df.withColumn('key',        F.lit('1')) # This succeeds.
df.withColumn(F.col('key'), F.lit('1')) # This causes an exception. <---- TypeError
Run Code Online (Sandbox Code Playgroud)

您可能想知道为什么我要使用第二种变体。这是因为我需要访问.alias()添加metadata到该列的方法,如下所示:

df.withColumn(F.col('key').alias('key', metadata={'foo':'bar'}), F.lit('1'))
Run Code Online (Sandbox Code Playgroud)

我们如何让第二个变体工作和/或插入metadata所需的?请记住,真实DataFrame已经存在(也就是说,我无法像在这个简单示例中那样从头开始创建)。

谢谢!=:)

Psi*_*dom 5

withColumn要求第一个参数是字符串,所以不要认为第二个选项可以工作;您可能只是使用select别名添加一个新列:

df.select("*", F.lit(1).alias("key", metadata={"foo": "bar"})).show()
+----+----+----+---+
|col0|col2|col3|key|
+----+----+----+---+
|  10| ten|10.0|  1|
+----+----+----+---+
Run Code Online (Sandbox Code Playgroud)

或者你可以使用aliasF.lit使用的时候withColumn

df.withColumn("key", F.lit(1).alias(None, metadata={"foo": "bar"})).show()
+----+----+----+---+
|col0|col2|col3|key|
+----+----+----+---+
|  10| ten|10.0|  1|
+----+----+----+---+
Run Code Online (Sandbox Code Playgroud)