Python 如何在Pyspark中转换一列数据帧,同时保持其余数据帧不变?
例如,我有一个数据帧Python 如何在Pyspark中转换一列数据帧,同时保持其余数据帧不变?,python,apache-spark,pyspark,Python,Apache Spark,Pyspark,例如,我有一个数据帧 df.show() +---+-----+ |age| name| +---+-----+ | 1|Alice| | 2| Bob| | 4| Bill| +---+-----+ 现在,我想以这样一种方式进行转换,即name列变为struct类型,其中有两列“name\u id”,现在所有值都可以为0,而“name\u text”是name列中的值。 注意:df可以更改。因此,我无法硬编码模式。它必须是动态的。 比如说,如果我需要这样一个函数 func(df)
df.show()
+---+-----+
|age| name|
+---+-----+
| 1|Alice|
| 2| Bob|
| 4| Bill|
+---+-----+
现在,我想以这样一种方式进行转换,即name列变为struct类型,其中有两列“name\u id”,现在所有值都可以为0,而“name\u text”是name列中的值。
注意:df可以更改。因此,我无法硬编码模式。它必须是动态的。
比如说,如果我需要这样一个函数
func(df)
应该给出一个df作为
+---+---------+
|age| name|
+---+---------+
| 1|[0,Alice]|
| 2| [0,Bob]|
| 4| [0,Bill]|
+---+---------+
这将是一个巨大的帮助谢谢你
def generate_intial_transform_schema(df,column_id):
index= 0
schemaList = []
for schema in df.schema:
if index == column_id:
schemaList.append(
StructField(schema.name,StructType([
StructField("value",schema.dataType,schema.nullable),
StructField("id",schema.dataType,True),
]),True))
else:
schemaList.append(schema)
index += 1
generated_schema = StructType(schemaList)
return generated_schema
def intial_transform(lines,column_id):
return_touple = ()
for i in range(0,len(df.columns)):
if i!= column_id:
return_touple = return_touple+(lines[i],)
else:
return_touple = return_touple+((lines[i],1),)
return return_touple
因此,您调用map函数
df2 = df1.rdd.map(
lambda lines:intial_transform(lines,1)
).toDF(
generate_intial_transform_schema(lines,1)
)