繁体   English   中英

值 toDF 不是 org.apache.spark.rdd.RDD[(K, V)] 的成员

[英]value toDF is not a member of org.apache.spark.rdd.RDD[(K, V)]

注意:在以下问题的答案中给出的建议无效 toDF is not a member of org.apache.spark.rdd.RDD value toDF is not a member of org.apache.spark.rdd.RDD[Weather]

我正在尝试编写一个通用的 function ,它只保留给定数据集中每个键的前 k 值:

下面是代码:

def topKReduceByKey[K:ClassTag,V:Ordering](ds: Dataset[(K, V)], k: Int): Dataset[(K, V)] = {
    import sqlContext.implicits._
    ds
      .rdd
      .map(tuple => (tuple._1, Seq(tuple._2)))
      .reduceByKey((x, y) => (x ++ y).sorted(Ordering[V].reverse).take(k))
      .flatMap(tuple => tuple._2.map(v => (tuple._1, v)))
      .toDF("key", "value")
      .as[(K, V)]
  }

运行此程序时,我收到以下错误消息:

Error:(43, 8) value toDF is not a member of org.apache.spark.rdd.RDD[(K, V)]
possible cause: maybe a semicolon is missing before `value toDF'?
      .toDF("key", "value")

谁能帮我理解这里出了什么问题?

有多种方法可以做到这一点(分组、分区、迭代分区),但只有在您喜欢自定义分区时才应该使用 RDD,对于其他任何事情,您应该使用 Dataframe 或数据集。

我将提供一个 Python 版本,使用 Dataframes。 对于带有数据集的 Scala 来说,这应该是一个很好的开始示例(API 是相同的)。

def topKByColumn(df, group_column, ordering_column, k):
    window = Window.partitionBy(df[group_column]).orderBy(df[ordering_column].desc())
    top_k = df.withColumn('rank', row_number().over(window))
    top_k = top_per[top_k.rank <= k]
    return top_k

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM