Spark(scala)在嵌套数组中反转StringIndexer
Spark (scala) reversing StringIndexer in nested array
我有一个隐式 ALS 模型,我正在使用 recommendForAllUsers 获得 X 推荐,问题是我得到的是用户和项目的索引值:
+-------+--------------------+
|users | items |
+-------+--------------------+
| 1580|[[34,0.20143434],...|
| 4900|[[22,0.3178908], ...|
| 5300|[[5,0.025709413],...|
| 6620|[[22,2.9114444E-9...|
| 7240|[[5,0.048516575],...|
+-------+--------------------+
我想将它们都转换为原始字符串表示形式。
我尝试按照此处建议的解决方案进行操作:
但它在 pyspark 中,我很难将它解析为 scala,因为 pyspark 语法对我来说不是很清楚。
主要是以下部分我不太清楚:
从 pyspark.sql.functions 导入数组、col、lit、struct
n = 3 # Same as numItems
product_labels_ = array(*[lit(x) for x in product_labels])
recommendations = array(*[struct(
product_labels_[col("recommendations")[i]["productIdIndex"]].alias("productId"),
col("recommendations")[i]["rating"].alias("rating")
) for i in range(n)])
recs.withColumn("recommendations", recommendations)
任何帮助将不胜感激!
语法几乎相同:
val n = 3
val product_labels_ = array(product_labels.map(lit): _*)
val recommendations = array((0 until n).map(i => struct(
product_labels_(col("recommendations")(i)("productIdIndex")).alias("productId"),
col("recommendations")(i)("rating").alias("rating")
)): _*)
recs.withColumn("recommendations", recommendations)
udf
可能更容易理解 如果标签在整数范围内:
case class Rec(label: String, rating: Double)
def translateLabels(labels: Seq[String]) = udf {
(recs: Seq[Row]) => recs.map {
case Row(i: Int, v: Double) => Rec(labels(i), v)
}
}
我有一个隐式 ALS 模型,我正在使用 recommendForAllUsers 获得 X 推荐,问题是我得到的是用户和项目的索引值:
+-------+--------------------+
|users | items |
+-------+--------------------+
| 1580|[[34,0.20143434],...|
| 4900|[[22,0.3178908], ...|
| 5300|[[5,0.025709413],...|
| 6620|[[22,2.9114444E-9...|
| 7240|[[5,0.048516575],...|
+-------+--------------------+
我想将它们都转换为原始字符串表示形式。
我尝试按照此处建议的解决方案进行操作:
但它在 pyspark 中,我很难将它解析为 scala,因为 pyspark 语法对我来说不是很清楚。
主要是以下部分我不太清楚: 从 pyspark.sql.functions 导入数组、col、lit、struct
n = 3 # Same as numItems
product_labels_ = array(*[lit(x) for x in product_labels])
recommendations = array(*[struct(
product_labels_[col("recommendations")[i]["productIdIndex"]].alias("productId"),
col("recommendations")[i]["rating"].alias("rating")
) for i in range(n)])
recs.withColumn("recommendations", recommendations)
任何帮助将不胜感激!
语法几乎相同:
val n = 3
val product_labels_ = array(product_labels.map(lit): _*)
val recommendations = array((0 until n).map(i => struct(
product_labels_(col("recommendations")(i)("productIdIndex")).alias("productId"),
col("recommendations")(i)("rating").alias("rating")
)): _*)
recs.withColumn("recommendations", recommendations)
udf
可能更容易理解 如果标签在整数范围内:
case class Rec(label: String, rating: Double)
def translateLabels(labels: Seq[String]) = udf {
(recs: Seq[Row]) => recs.map {
case Row(i: Int, v: Double) => Rec(labels(i), v)
}
}