I have a Python function:
def get_log_probability(string, transition_log_probabilities):
string = ngrams(string, 2)
terms = [transition_log_probabilities[bigram]
for bigram in string]
log_probability = sum(terms)/len(terms) if len(terms) > 0 else sum(terms)
return log_probability
I want to use this function for Pyspark DataFrame column with transition_log_probabilities as a constant as follows:
transition_log_probabilities = {('a', 'a'): -3.688879454113936,
('a', 'b'): -3.688879454113936,
('a', 'c'): -3.688879454113936,
('b', 'a'): -3.688879454113936,
('b', 'b'): -3.688879454113936,
('b', 'c'): -3.688879454113936,
('c', 'a'): -3.688879454113936,
('c', 'b'): -3.688879454113936,
('c', 'c'): -3.688879454113936}
So I change it to Pyspark UDF:
def get_log_prob_udf(dictionary):
return udf(lambda string: get_log_probability(string, dictionary), FloatType())
Even though get_log_probability("abc", transition_log_probabilities) works and gives a result of -3.688879454113936, when I apply its UDF into Pyspark as follows:
df = df \
.withColumn("string_log_probability", get_log_prob_udf(transition_log_probabilities)(col('string')))
It doesn't work and throws out the error of
An error occurred while calling o3463.showString.
: org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage
182.0 failed 1 times, most recent failure: Lost task 0.0 in stage 182.0 (TID 774)
(kubernetes.docker.internal executor driver): net.razorvine.pickle.PickleException:
expected zero arguments for construction of ClassDict (for numpy.dtype)
Does anyone know how to solve it? Thank you very much.
transition_log_probabilitiesas a dictionary but how does it look like in a df column?transition_log_probabilities = {('a', 'a'): -3.688879454113936, ('a', 'b'): -3.688879454113936, ('a', 'c'): -3.688879454113936, ('b', 'a'): -3.688879454113936, ('b', 'b'): -3.688879454113936, ('b', 'c'): -3.688879454113936, ('c', 'a'): -3.688879454113936, ('c', 'b'): -3.688879454113936, ('c', 'c'): -3.688879454113936}col('string')column? Can you provide some exemples of your df?df = spark.createDataFrame([(1, "bc"), (2, "aa"), (3, "ca")], ["id", "string"]