Vector Assembler ile PySpark dönüştürme yöntemi

Sep 26 2020

Bir Spark DataFrame'im var ve Vector Assembler'ı bir "özellikler" sütunu oluşturmak için kullanmak istiyorum.

from pyspark.ml.feature import VectorAssembler

assembler = VectorAssembler(inputCols=sel_cols, outputCol='features')

transformed_data = assembler.transform(sdf)

sel_cols, aşağıdaki gibi görünen 150 öğe dizgi türünden oluşan bir listeden oluşur:

['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',...]

Ve sdf.columns, 340 maddeden oluşur ve aşağıdaki gibi görünür:

['.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',...]

Transformed_data = assembler.transform (sdf) uygularken bu hatayı alıyorum:

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,...

Gösterildiği gibi, "ASP.NET Core" kesinlikle sdf.columnslarım arasındadır ve anladığım kadarıyla sel_cols'u VectorAssembler'in inputCols dizgesine bir dizi listesi olarak iletmek işe yaramalı ... Çalışmadığım için gerçekten minnettar olurum Spark DF'ler ile :)

Teşekkür ederim!

Yanıtlar

1 werner Sep 26 2020 at 22:56

VectorAssembler, sütun adında boşluk veya nokta bulunan sütunları işleyemez. Benden başka bir cevap, neden işe yaramadığına dair bazı teknik arka plan sağlar.

Tek seçenek, sütunları yeniden adlandırmaktır:

#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)