我想在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中实现相同的功能。
答案 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