【问题标题】:Spark (scala) reversing StringIndexer in nested arraySpark(scala)在嵌套数组中反转StringIndexer
【发布时间】:2018-06-16 14:38:40
【问题描述】:

我有一个隐式 ALS 模型,我正在使用 RecommendationForAllUsers 获得 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 reversing StringIndexer in nested array

但它在 pyspark 中,我很难将其解析为 scala,因为 pyspark 语法对我来说不是很清楚。

主要是以下部分我不清楚: from 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)

任何帮助将不胜感激!

【问题讨论】:

    标签: scala apache-spark pyspark apache-spark-sql apache-spark-ml


    【解决方案1】:

    语法几乎相同:

    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)
       }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-09
      • 2020-08-24
      • 2020-04-04
      • 2014-07-12
      • 2016-07-19
      • 2020-12-06
      • 1970-01-01
      • 2012-09-20
      相关资源
      最近更新 更多