例如,我有一个数据框
df.show()
+---+-----+
|age| name|
+---+-----+
| 1|Alice|
| 2| Bob|
| 4| Bill|
+---+-----+
现在我想以这样的方式进行转换,即名称列成为结构类型,其中两列“ name_id”现在可以为所有值提供0,而“ name_text”即为名称列中的值。 注意:df可以更改。所以我不能硬编码架构。它必须是动态的。 因此,例如,如果我需要这样的功能
func(df)
应该给df作为
+---+---------+
|age| name|
+---+---------+
| 1|[0,Alice]|
| 2| [0,Bob]|
| 4| [0,Bill]|
+---+---------+
这将对您有很大帮助。
答案 0 :(得分:-2)
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
所以,您调用地图函数
df2 = df1.rdd.map(
lambda lines:intial_transform(lines,1)
).toDF(
generate_intial_transform_schema(lines,1)
)