我知道有類似的執行緒,但我無法用這些解決方案解決我的錯誤。
這是我的架構:
root
|-- embeddings: array (nullable = true)
| |-- element: float (containsNull = true)
|-- id: long (nullable = true)
我正在嘗試按 id 進行分組,并在該范圍內的所有embeddings范圍內執行成對余弦相似度id
這是我的端到端代碼:
import pyspark.sql.types as T
import pyspark.sql.functions as F
embeddings=spark.read.parquet('directory')
schema = T.StructType([T.StructField("shop_id", T.LongType(), True),
T.StructField("cosine_similarities", T.ArrayType(T.ArrayType(T.DoubleType(), True), True))
])
@F.pandas_udf(schema, F.PandasUDFType.GROUPED_MAP)
def cosine_sim_udf(df):
single_col = df.select(F.col('embeddings'))
single_col_flatmap = single_col.rdd.flatMap(lambda x: x).collect()
cosine_sim = cosine_similarity(single_col_flatmap)
return cosine_sim
embeddings.groupBy("shop_id").apply(cosine_sim_udf).show(1)
這會引發以下錯誤:
AttributeError:“NoneType”物件沒有屬性“_jvm”
現在,為了除錯它,我在一個函式中運行了代碼id并且沒有遇到問題。
single_col = embeddings.filter("id =1").select(F.col('embeddings'))
single_col_flatmap = single_col.rdd.flatMap(lambda x: x).collect()
cosine_sim = cosine_similarity(single_col_flatmap)
任何幫助將非常感激。
uj5u.com熱心網友回復:
您收到該錯誤是因為您嘗試在pandas_udf. 但是,df傳遞給的引數cosine_sim_udf是 pandas 資料框。請參閱檔案:
支持 Pandas 實體的分組映射操作,
DataFrame.groupby().applyInPandas()這需要一個 Python 函式,該函式接受一個pandas.DataFrame并回傳另一個pandas.DataFrame
您需要將代碼更改為以下內容:
import pandas as pd
from sklearn.metrics.pairwise import cosine_similarity
import pyspark.sql.functions as F
@F.pandas_udf(schema, F.PandasUDFType.GROUPED_MAP)
def cosine_sim_udf(pdf):
em = pdf["embeddings"].values.tolist()
cosine_sim = pd.DataFrame({'cosine_similarities': [cosine_similarity(em).tolist()]})
cosine_sim["shop_id"] = pdf["shop_id"]
return cosine_sim
例子:
embeddings = spark.createDataFrame([
(1, [1., 0., 3., 5.]), (1, [6., 7., 8., 5.]),
(2, [1.3, 4.4, 2.1, 3.9]), (2, [9., 5., 0., 3.]),
(3, [1.3, 4.4, 2.1, 3.9]), (3, [9., 5., 0., 3.])
], ["shop_id", "embeddings"])
embeddings.groupBy("shop_id").apply(cosine_sim_udf).show(truncate=False)
# ------- ---------------------------------------------------------------------
#|shop_id|cosine_similarities |
# ------- ---------------------------------------------------------------------
#|1 |[[1.0, 0.704780765735282], [0.704780765735282, 0.9999999999999999]] |
#|2 |[[1.0, 0.6638498270978581], [0.6638498270978581, 1.0000000000000002]]|
#|3 |[[1.0, 0.6638498270978581], [0.6638498270978581, 1.0000000000000002]]|
# ------- ---------------------------------------------------------------------
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/416377.html
標籤:
下一篇:SparkStructuredStreaming在帶有Trigger.Once的Databricks上沒有顯示輸出
