Apache Spark 循环两个变量以创建多个年份列

yx2lnoni  于 2022-11-16  发布在  Apache
关注(0)|答案(4)|浏览(115)

如果我有表

|a      | b     | c|
|"hello"|"world"| 1|

并且变量

start =2000 
end =2015

如何在pyspark中添加15列,第一列为m2000,第二列为m2001等,所有这些新列都为0,因此新 Dataframe 为

|a      | b     | c|m2000 | m2001 | m2002 | ... | m2015|
|"hello"|"world"| 1| 0    | 0     | 0     | ... |   0  |

我已经试过下面但是

df = df.select(
        '*',
        *["0".alias(f'm{i}') for i in range(2000, 2016)]
    )
    df.show()

我收到错误

AttributeError: 'str' object has no attribute 'alias'
ha5z0ras

ha5z0ras1#

您可以简单地使用withColumn添加相关列。

from pyspark.sql.functions import col,lit

df = spark.createDataFrame(data=[("hello","world",1)],schema=["a","b","c"])

df.show()

+-----+-----+---+
|    a|    b|  c|
+-----+-----+---+
|hello|world|  1|
+-----+-----+---+

for i in range(2000, 2015):
    df = df.withColumn("m"+str(i), lit(0))

df.show()

+-----+-----+---+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
|    a|    b|  c|m2000|m2001|m2002|m2003|m2004|m2005|m2006|m2007|m2008|m2009|m2010|m2011|m2012|m2013|m2014|
+-----+-----+---+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
|hello|world|  1|    0|    0|    0|    0|    0|    0|    0|    0|    0|    0|    0|    0|    0|    0|    0|
+-----+-----+---+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
vatpfxk5

vatpfxk52#

您可以使用一行程序

df = df.select(df.columns + [F.lit(0).alias(f"m{i}") for i in range(2000, 2015)])

完整示例:

df = spark.createDataFrame([["hello","world",1]],["a","b","c"])
df = df.select(df.columns + [F.lit(0).alias(f"m{i}") for i in range(2000, 2015)])

[Out]:
+-----+-----+---+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
|    a|    b|  c|m2000|m2001|m2002|m2003|m2004|m2005|m2006|m2007|m2008|m2009|m2010|m2011|m2012|m2013|m2014|
+-----+-----+---+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
|hello|world|  1|    0|    0|    0|    0|    0|    0|    0|    0|    0|    0|    0|    0|    0|    0|    0|
+-----+-----+---+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
brccelvz

brccelvz3#

pandas中,可以执行以下操作:

import pandas as pd

df = pd.Series({'a': 'Hello', 'b': 'World', 'c': 1}).to_frame().T
df[['m{}'.format(x) for x in range(2000, 2016)]] = 0
print(df)

我不是很熟悉Spark合成器,但方法应该是几乎相同的。
正在发生的情况:术语['m{}'.format(x) for x in range(2000, 2016)]是一个列表理解,它创建了所需列名的列表。我们将值0赋给这些列。由于这些列尚不存在,因此添加它们。

2cmtqfgy

2cmtqfgy4#

生成额外列的代码非常好-只需将"0" Package 在lit函数中,如下所示:

from pyspark.sql.functions import lit

df.select('*', *[lit("0").alias(f'm{i}') for i in range(2000, 2016)]).show()

+-----+-----+---+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
|    a|    b|  c|m2000|m2001|m2002|m2003|m2004|m2005|m2006|m2007|m2008|m2009|m2010|m2011|m2012|m2013|m2014|m2015|
+-----+-----+---+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
|hello|world|  1|    0|    0|    0|    0|    0|    0|    0|    0|    0|    0|    0|    0|    0|    0|    0|    0|
+-----+-----+---+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+

重复调用withColumn方法要谨慎--每次新调用它都会在Spark的查询执行计划中创建一个新的投影,这会导致计算开销非常大。

相关问题