以下给了我一个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
您可能想知道为什么我想使用第二种变体。这是因为我需要访问 .alias()
方法以将metadata
添加到该列,如下所示:
df.withColumn(F.col('key').alias('key', metadata={'foo':'bar'}), F.lit('1'))
我们如何让第二个变体工作和/或插入所需的metadata
?请记住,真正的DataFrame
已经存在(这意味着,我不能像在这个简单示例中那样从头开始创建一个(。
谢谢!=:)
withColumn
要求第一个参数是字符串,所以不要认为第二个选项可以工作;您可以只使用 select
添加一个带有别名的新列:
df.select("*", F.lit(1).alias("key", metadata={"foo": "bar"})).show()
+----+----+----+---+
|col0|col2|col3|key|
+----+----+----+---+
| 10| ten|10.0| 1|
+----+----+----+---+
或者您可以在使用withColumn
时在F.lit
上使用alias
:
df.withColumn("key", F.lit(1).alias(None, metadata={"foo": "bar"})).show()
+----+----+----+---+
|col0|col2|col3|key|
+----+----+----+---+
| 10| ten|10.0| 1|
+----+----+----+---+