Metode transformasi PySpark dengan Vector Assembler
Saya memiliki Spark DataFrame dan saya ingin menggunakan Vector Assembler untuk membuat kolom "fitur".
from pyspark.ml.feature import VectorAssembler
assembler = VectorAssembler(inputCols=sel_cols, outputCol='features')
transformed_data = assembler.transform(sdf)
sel_cols terdiri dari daftar 150 item dengan tipe string, yang terlihat sebagai berikut:
['ASP.NET Core',
'ASP.NET MVC',
'AWS',
'AWS DynamoDB',
'AWS EMR',
'AWS SDK',
'Adobe Photoshop',
'Agile',
'Agile software development29',
'Ajax',
'Amazon CloudFront CDN',
'Amazon EC2',
'Android',
'Angular',
'AngularJS',
'Apache',
'Apache Hive',
'Apache Spark',
'Atom',...]
Dan sdf.columns, terdiri dari 340 item dan tampilannya sebagai berikut:
['.NET',
'.NET 4',
'.NET Core',
'ADO.NET',
'AFNetworking',
'API Architecture',
'API Design',
'API Development',
'APIs',
'ASP.NET',
'ASP.NET Core',
'ASP.NET MVC',
'ASP.NET Web API',
'AWS',
'AWS DynamoDB',...]
Saya mendapatkan kesalahan ini dalam menerapkan transformed_data = assembler.transform (sdf):
AnalysisException: Cannot resolve column name "ASP.NET Core" among (.NET, .NET 4, .NET Core, ADO.NET, AFNetworking, API Architecture, API Design, API Development, APIs, ASP.NET, ASP.NET Core, ASP.NET MVC, ASP.NET Web API, AWS, AWS DynamoDB, AWS EC2, AWS ECS, AWS EMR, AWS HA, AWS Lambda, AWS RDS, AWS S3, AWS SDK, Adobe Illustrator,...
Seperti yang ditunjukkan, "ASP.NET Core" pasti ada di antara sdf.columns saya dan sejauh yang saya pahami, meneruskan sel_cols sebagai daftar string ke inputCols VectorAssembler seharusnya berfungsi ... Akan sangat menghargai wawasan apa pun karena saya belum bekerja dengan Spark DF sebelumnya :)
Terima kasih!
Jawaban
VectorAssembler tidak dapat menangani kolom dengan spasi atau titik di nama kolom. Jawaban lain dari saya memberikan beberapa latar belakang teknis mengapa tidak berhasil.
Satu-satunya pilihan adalah mengganti nama kolom:
#build a dict (orginal column name: new column name)
mapping = {col: col.replace('.','_').replace(' ', '_') for col in sel_columns}
#select all columns and create an alias if there is a mapping for this column
df_renamed = df.select([F.col('`'+c+'`').alias(mapping.get(c, c)) for c in df.columns])
#create a VectorAssembler that uses the renamed columns as input
assembler = VectorAssembler(inputCols=list(mapping.values()), outputCol='features')
transformed_data = assembler.transform(df_renamed)