繁体   English   中英

在 Spark-Scala 中将 Dataset[Row] 转换为 RDD[Array[String]] 的最佳方法?

[英]Best approach to transform Dataset[Row] to RDD[Array[String]] in Spark-Scala?

我正在通过读取 csv 文件来创建火花数据集。 此外,我需要将此 Dataset[Row] 转换为 RDD[Array[String]] 以将其传递给 FpGrowth(Spark MLLIB)。

val df: DataFrame = spark.read.format("csv").option("header", "true").load("/path/to/csv")
val ds: Dataset[Row] = df.groupBy("user").agg(collect_set("values"))

现在,我需要 select 列“”并将结果数据集转换为RDD[Array[String]]

val rddS: RDD[String] = ds.select(concat_ws(",", col("values")).as("items")).distinct().rdd.map(_.mkString(","))
val rddArray: RDD[Array[String]] = rddS.map(s => s.trim.split(','))

我尝试了这种方法,但不确定它是否是最好的方法。 请建议我实现这一目标的最佳方法。

单线:

val rddArray: RDD[Array[String]] = ds.select("values").as[Array[String]].rdd

顺便说一句,我建议使用基于数据帧的 Spark ML,而不是现在已弃用的基于 RDD 的 Spark MLLib。 您可以使用org.apache.spark.ml.fpm.FPGrowth

我最终使用了 toSeq 方法

val rddArray: RDD[Array[String]] = ds.select("values").rdd.map(r => r.getSeq[String](0).toArray)

这对我的用例来说更有效(更快)。

为什么不简单地使用如下,你会减少concat_wssplit操作。

val rddS:RDD[Array[String]] = ds.select("values")
    .distinct()
    .rdd.map(r => r.getAs[mutable.WrappedArray[String]](0).toArray)

暂无
暂无

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

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