Phương pháp biến đổi PySpark với Vector Assembler
Tôi có một Spark DataFrame và tôi muốn sử dụng Vector Assembler để tạo cột "tính năng".
from pyspark.ml.feature import VectorAssembler
assembler = VectorAssembler(inputCols=sel_cols, outputCol='features')
transformed_data = assembler.transform(sdf)
sel_cols bao gồm danh sách 150 mục kiểu chuỗi, trông như sau:
['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',...]
Và sdf.columns, bao gồm 340 mục và trông như sau:
['.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',...]
Tôi gặp lỗi này khi áp dụng biến đổi_data = assemblybler.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,...
Như được hiển thị, "ASP.NET Core" chắc chắn nằm trong số sdf.columns của tôi và theo như tôi hiểu, việc chuyển sel_cols dưới dạng danh sách chuỗi vào Công cụ đầu vào của VectorAssembler sẽ hoạt động ... Thực sự sẽ đánh giá cao bất kỳ thông tin chi tiết nào vì tôi chưa làm việc với Spark DF trước :)
Cảm ơn bạn!
Trả lời
VectorAssembler không thể xử lý các cột có dấu cách hoặc dấu chấm trong tên cột. Một câu trả lời khác từ tôi cung cấp một số nền tảng kỹ thuật tại sao nó không hoạt động.
Tùy chọn duy nhất là đổi tên các cột:
#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)