亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

向 StructType 添加新列時的行為不明確

向 StructType 添加新列時的行為不明確

繁花不似錦 2021-06-12 12:22:26
我在 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)))


查看完整回答
反對 回復 2021-06-15
  • 1 回答
  • 0 關注
  • 245 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號