【问题标题】:Converting a Spark's DataFrame column to List[String] in Scala在 Scala 中将 Spark 的 DataFrame 列转换为 List[String]
【发布时间】:2017-02-26 23:55:30
【问题描述】:

我正在处理Movie Lens 数据集。在csv 文件之一中,数据结构如下:

movieIdmovieTitlegenres

genres 又是| 分隔值的列表,该字段可以为空。

我正在尝试获取所有 genres 的唯一列表,以便我可以重新排列数据如下:

movieIdmovieTitlegenre1genre2...genreN

一行,genregenre1 | genre2 看起来像:

1Title1110...0

到目前为止,我已经能够使用以下代码读取csv 文件:

val conf         = new SparkConf().setAppName(App.name).setMaster(App.sparkMaster)
val context      = new SparkContext(conf)
val sparkSession = SparkSession.builder()
                   .appName(App.name)
                   .config("header", "true")
                   .config(conf = conf)
                   .getOrCreate()

val movieFrame: DataFrame = sparkSession.read.csv(moviesPath)

如果我尝试类似:

movieFrame.rdd.map(row ⇒ row(2).asInstanceOf[String]).collect()

然后我得到以下异常:

java.lang.ClassNotFoundException: com.github.babbupandey.ReadData$$anonfun$1

然后,此外,我尝试使用以下代码显式提供架构:

val moviesSchema: StructType = StructType(Array(StructField("movieId", StringType, nullable = true),
                                                        StructField("title", StringType, nullable = true),
                                                        StructField("genres", StringType, nullable = true)))

并尝试过:

val movieFrame: DataFrame = sparkSession.read.schema(moviesSchema).csv(moviesPath)

然后我得到了同样的异常。

有什么方法可以将genres 设置为ListSet,以便进一步将数据处理成所需的格式?任何帮助将不胜感激。

【问题讨论】:

    标签: scala csv apache-spark dataframe spark-dataframe


    【解决方案1】:

    以下是我获得这组流派的方法:

    val genreList: Array[String] = for (row <- movieFrame.select("genres").collect) yield row.getString(0)
    val genres: Array[String] =  for {
            g ← genreList
            genres ← g.split("\\|")
        } yield genres
    val genreSet : Set[String] = genres.toSet
    

    【讨论】:

    • 这太棒了!!
    【解决方案2】:

    这可以提供一个 Array[Array[String]]

        val genreLst = movieFrame.select("genres").rdd.map(r =>     r(0).asInstanceOf[String].split("\\|").map(_.toString).distinct).collect()
    

    获取数组[字符串]

        val genres = genreLst.flatten
    

        val genreLst = movieFrame.select("genres").rdd.map(r => r(0).asInstanceOf[String].split("\\|").map(_.toString).distinct).collect().flatten
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-10
      • 2017-06-13
      • 2018-02-20
      • 1970-01-01
      • 2020-01-11
      • 1970-01-01
      相关资源
      最近更新 更多