Присоединяйтесь к лямбде в pysparkPython

Программы на Python
Ответить
Anonymous
 Присоединяйтесь к лямбде в pyspark

Сообщение Anonymous »

Предположим, у меня есть следующий фрейм данных статей.

Код: Выделить всё

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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»