(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")
< /code>
и Dataframe неверных в корреста-карт.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")
< /code>
Я пытался найти количество неверных слов в статьях, учитывая, что все неправильные слова были представлены в картировании. Я сделал это двумя способами, один использует левое соединение и группу, в то время как другие используют функции более высокого порядка. Это код. < /P>
- Использование соединения и группы, чтобы найти количество неправильных и правильных слов < /li>
< /ol>
(
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|
+---+-----+-------+---------+
'''
< /code>
Использование функций более высокого порядка. Здесь size правого DF- 1 .
"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|
+---+-----+---------+-------+
'''
< /code>
У меня есть два вопроса -< /p>
- Какой из них будет быстрее, чем другой < /li>
Какой из них предпочтительнее, когда увеличивается размер любой статьи или картирования? (Я предполагаю, что можно использовать первый, потому что, если размер картирования увеличится, будет трудно удерживать всю карту в каждой строке)
Подробнее здесь: https://stackoverflow.com/questions/796 ... in-pyspark