Я создал 3 кадра данных, выполнив следующий код.sample.csv
id|code|name|Lname|mname
2|AA|BB|CC|DD|
sample1.csv
id|code|name|Lname|mname
1|A|B|C|D|
sample2.csv
id1|code1|name1|Lnam|mnam
3|AAA|BBB|CCC|DDD|
Я сравнил заголовки фреймов данных, используя нечеткую логику, если всезаголовки столбцов 2 файла (sample1, sample2) среднее совпадение составляет 85%, тогда мне нужно распечатать оба файла одинаково.
example :
sample1.csv vs sample2.csv
+---------+--------+-----+
|f1_lab | f2_lab|score|
+---------+--------+-----+
| id | id1 | 80 |
| code | code1 | 89 |
| name | name1| 89 |
| Lname | Lnam | 89 |
| mname | mnam | 89 |
+---------+--------+-----+
мой окончательный результат будет средним из баллов, например: 80+89+89+89+89/5=87.2
(avgage Score),
, если средние оценки выше 80, я должен напечатать вывод, как sample1 and sample2 matched ,
.
, так как я должен сравнить весь заголовок файла с другим заголовком файла.Мне нужно идентифицировать все совпадающие файлы.
Пожалуйста, помогите мне в этом.
пожалуйста, найдите ниже код.
from pyspark.sql import SQLContext,SparkSession
spark = SparkSession.builder.appName("ALS").getOrCreate()
sc = spark.sparkContext
sqlContext = SQLContext(sc)
df = sqlContext.read.format('com.databricks.spark.csv').options(header='True', inferschema='false').option("delimiter", "|").load('C:/Users/test/Desktop/sample1.csv')
df1 = sqlContext.read.format('com.databricks.spark.csv').options(header='True', inferschema='false').option("delimiter", "|").load('C:/Users/test/Desktop/sample2.csv')
df2 = sqlContext.read.format('com.databricks.spark.csv').options(header='True', inferschema='false').option("delimiter", "|").load('C:/Users/test/Desktop/sample3.csv')
lab= [col_name for col_name in df.columns]
lab1=[col_name1 for col_name1 in df1.columns]
lab2=[col_name1 for col_name1 in df2.columns]
lab1head=sc.parallelize(lab).zipWithIndex()
a = spark.createDataFrame(lab1head,['label1', "Index"])
lab1head=sc.parallelize(lab1).zipWithIndex()
a1 = spark.createDataFrame(lab1head,['label2', "Index"])
lab2head=sc.parallelize(lab1).zipWithIndex()
a1 = spark.createDataFrame(lab2head,['label3', "Index"])
from fuzzywuzzy import fuzz
def match_name(name, list_names, min_score=0):
max_score = -1
# Returning empty name for no match as well
max_name = ""
# Iternating over all names in the other
for name2 in list_names:
#Finding fuzzy match score
score = fuzz.ratio(name, name2)
# Checking if we are above our threshold and have a better score
if (score > min_score) & (score > max_score):
max_name = name2
max_score = score
return (max_name, max_score)
dict_list = []
for name in a.label1:
# Use our method to find best match, we can set a threshold here
match = match_name(name, a1.label2, 75)
dict_ = {}
dict_.update({"labhead" : name})
dict_.update({"labhead1" : match[0]})
dict_.update({"score" : match[1]})
dict_list.append(dict_)