Код: Выделить всё
text_data = [
(1, "I hav a dreem that one day"),
(2, "Ths is a test of the emergncy broadcast systm"),
(3, "Speling errors are commn in som text"),
]
text_df = spark.createDataFrame(text_data, "id: int, article: string")
Код: Выделить всё
dict_data = [
("hav", "have"),
("dreem", "dream"),
("Ths", "This"),
("emergncy", "emergency"),
("systm", "system"),
("Speling", "Spelling"),
("commn", "common"),
("som", "some"),
]
dict_df = spark.createDataFrame(dict_data, "misspelled: string, correct: string")
- Использование объединения и группировки по для определения количества неправильных и правильных слов.
Код: Выделить всё
(
text_df
.select(
"id"
, F.explode(F.split(F.col("article"), " ")).alias("word")
)
.join(
dict_df
, F.col('word') == dict_df['misspelled']
, 'left'
)
.select(
"id"
, "word"
, dict_df['correct']
)
.groupBy("id")
.agg(
F.count(F.col('word')).alias('Total')
, F.count(F.when(F.col('correct').isNull(), 'isCorrect')).alias('Correct')
, F.count(F.col('correct')).alias('Incorrect')
)
.show()
)
'''
Output
+---+-----+-------+---------+
| id|Total|Correct|Incorrect|
+---+-----+-------+---------+
| 1| 7| 5| 2|
| 2| 9| 6| 3|
| 3| 7| 4| 3|
+---+-----+-------+---------+
'''
- Использование функций высшего порядка. Здесь размер правого df равен 1.
Код: Выделить всё
dict_data_2 = [[{
"hav": "have",
"dreem": "dream",
"Ths": "This",
"emergncy": "emergency",
"systm": "system",
"Speling": "Spelling",
"commn": "common",
"som": "some"
}]]
dict_df_2 = spark.createDataFrame(dict_data_2, "incorrect_to_correct_mapping: map")
text_df = spark.createDataFrame(text_data, "id: int, article: string")
(
text_df
.join(
dict_df_2
, how = 'cross'
)
.withColumns({
'words': F.split(F.col('article'), ' ')
, 'map_keys': F.map_keys('incorrect_to_correct_mapping')
, 'incorrect':
F.filter(
F.col('words')
, lambda word: F.array_contains(F.col('map_keys'), word)
)
, 'correct':
F.filter(
F.col('words')
, lambda word: ~F.array_contains(F.col('map_keys'), word)
)
})
.select(
"id"
, F.array_size("words").alias("Total")
, F.array_size("incorrect").alias("Incorrect")
, F.array_size("correct").alias("Correct")
)
.show()
)
'''
Output
+---+-----+---------+-------+
| id|Total|Incorrect|Correct|
+---+-----+---------+-------+
| 1| 7| 2| 5|
| 2| 9| 3| 6|
| 3| 7| 3| 4|
+---+-----+---------+-------+
'''
- Какой из них будет быстрее другого
- Какому из них следует отдать предпочтение, когда размер статьи или отображения увеличивается? (Я предполагаю, что лучше использовать первый вариант, потому что если размер карты увеличится, то будет сложно разместить всю карту в каждой строке)
Подробнее здесь: https://stackoverflow.com/questions/796 ... in-pyspark