我在 PySpark 中定義了一個函數,它是-def add_ids(X): schema_new = X.schema.add("id_col", LongType(), False) _X = X.rdd.zipWithIndex().map(lambda l: list(l[0]) + [l[1]]).toDF(schema_new) cols_arranged = [_X.columns[-1]] + _X.columns[0:len(_X.columns) - 1] return _X.select(*cols_arranged)在上面的函數中,我正在創建一個新列(名稱為id_col),該列附加到數據框,它基本上只是每行的索引號,最后將 移到id_col最左側。我正在使用的數據>>> X.show(4)+-----------+-------+-------------+-------------+-------+----+------------------------+---+-------+|Pregnancies|Glucose|BloodPressure|SkinThickness|Insulin| BMI|DiabetesPedigreeFunction|Age|Outcome|+-----------+-------+-------------+-------------+-------+----+------------------------+---+-------+| 6| 148| 72| 35| 0|33.6| 0.627| 50| 1|| 1| 85| 66| 29| 0|26.6| 0.351| 31| 0|| 8| 183| 64| 0| 0|23.3| 0.672| 32| 1|| 1| 89| 66| 23| 94|28.1| 0.167| 21| 0|+-----------+-------+-------------+-------------+-------+----+------------------------+---+-------+only showing top 4 rows所有這些工作正常,但問題是當我運行以下兩個命令時>>> X.columns['Pregnancies', 'Glucose', 'BloodPressure', 'SkinThickness', 'Insulin', 'BMI', 'DiabetesPedigreeFunction', 'Age', 'Outcome', 'id_col']如果您查看 的結果X.columns,您會id_col在最后注意到。但是當我之前運行X.show(4)a 行時,它沒有顯示id_col為一列?,F在,當我嘗試運行時add_ids(X).show(4),出現以下錯誤pyspark.sql.utils.AnalysisException: "Reference 'id_col' is ambiguous, could be: id_col, id_col.;"我做錯了什么?
1 回答

桃花長相依
TA貢獻1860條經驗 獲得超8個贊
錯誤在這里:
schema_new = X.schema.add("id_col", LongType(), False)
如果您檢查源,您將看到該add方法修改了適當的數據。
在簡化的示例中更容易看到:
from pyspark.sql.types import *
schema = StructType()
schema.add(StructField("foo", IntegerType()))
schema
StructType(List(StructField(foo,IntegerType,true)))
如您所見,該schema對象已被修改。
add您應該重建架構而不是使用方法:
schema_new = StructType(schema.fields + [StructField("id_col", LongType(), False)])
或者,您可以創建對象的深層副本:
import copy
old_schema = StructType()
new_schehma = copy.deepcopy(old_schema).add(StructField("foo", IntegerType()))
old_schema
StructType(List())
new_schehma
StructType(List(StructField(foo,IntegerType,true)))
添加回答
舉報
0/150
提交
取消