如何在Scala中将不同的值作为分数映射获取?

时间:2018-06-06 21:45:40

标签: python scala apache-spark

我想在Scala中对我的数据帧进行分层抽样。我的数据框只有一列,我想为它形成一个分数图。我可以在pyspark中执行此操作,但它在Scala中给出了错误。这是我在Scala中尝试的内容:

import org.apache.spark.sql.functions.{lit}
val fractions = pqdf.select("vin").distinct().withColumn("fraction", lit(0.001)).rdd.collect().toMap

错误地说:

Error:(25, 100) Cannot prove that org.apache.spark.sql.Row <:< (T, U). val fractions = pqdf.select("vin").distinct().withColumn("fraction", lit(0.001)).rdd.collect().toMap

我该如何解决?我想在.samplyBy方法中使用上面创建的分数图作为参数之一

val sampled_df = pqdf.stat.sampleBy("vin", fractions, 10L)

这是我在pyspark尝试过的方法:

from pyspark.sql.functions import lit
fractions = df.select("VIN").distinct().withColumn("fraction", lit(0.001)).rdd.collectAsMap()
# fractions
sampled_df = df.stat.sampleBy("VIN", fractions, 10)

我不确定如何在Scala中实现相同的功能。

1 个答案:

答案 0 :(得分:0)

它会给您一个错误,因为RDD[Row]会返回Map。要使其工作,您需要一些可转换为Map[String, Double]的内容(例如,如果您需要df.select("VIN").distinct() .select($"VIN".cast("string")) .withColumn("fraction", lit(0.001)) .as[(String, Double)] .rdd .collectAsMap() ):

df.select("VIN").distinct()
  .withColumn("fraction", lit(0.001))
  .rdd
  .map { case Row(vin, fraction: Double) => (vin.toString, fraction) }
  .collectAsMap()

GetNumber