如果我有桌子
|a | b | c|
|"hello"|"world"| 1|
和變數
start =2000
end =2015
我如何在 pyspark 中添加 15 列,第一列 m2000 和第二列 m2001 等,所有這些新列都有 0,所以新資料框是
|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'
uj5u.com熱心網友回復:
您可以簡單地使用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|
----- ----- --- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----
uj5u.com熱心網友回復:
您可以使用單線
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|
----- ----- --- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----
uj5u.com熱心網友回復:
在 中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-synthax 不是很熟悉,但方法應該幾乎相同。
發生了什么:該術語['m{}'.format(x) for x in range(2000, 2016)]是一種串列理解,可創建所需列名的串列。我們將值 0 分配給這些列。由于這些列尚不存在,因此已添加它們。
uj5u.com熱心網友回復:
您生成額外列的代碼非常好 - 只需要包裝"0"inlit函式,如下所示:
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 的查詢執行計劃中創建一個新的投影,并且它在計算上會變得非常昂貴。僅使用單個select將始終是更好的方法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/531085.html
