在scala中将Spark Dataframe转换为RDD

Posted

技术标签:

【中文标题】在scala中将Spark Dataframe转换为RDD【英文标题】:Converting Spark Dataframe to RDD in scala 【发布时间】:2016-05-09 07:49:45 【问题描述】:

我正在寻找更好的方法将 Dataframe 转换为 RDD。现在我正在将数据帧转换为集合并循环集合以准备 RDD。但我们知道循环不是好习惯。

   val randomProduct = scala.collection.mutable.MutableList[Product]()
   val results = hiveContext.sql("select id,value from  details");
   val collection = results.collect();    
   var i = 0;
   results.collect.foreach(t => 
       val product = new Product(collection(i)(0).asInstanceOf[Long], collection(i)(1).asInstanceOf[String]); 
       i = i+ 1;
       randomProduct += product 
   )

   randomProduct
   //returns RDD[Product]

请建议我将其设为适用于大量数据的标准且稳定的格式。

【问题讨论】:

一是海量数据和收集的不是很好的朋友,二是Loop,为什么?你想做什么:“转换+???”? 谢谢以利亚。我需要 RDD[Product],我将使用它来应用一些规则。 【参考方案1】:
val results = hiveContext.sql("select id,value from  details");
results.rdd.map( row => new Product( row.getLong(0), row.getString(1) ) ) // RDD[Product]

【讨论】:

感谢您的回答。现在正在重新调整org.apache.spark.rdd.RDD[com.cloudera.mypacl.Product] but required is scala.collection.mutable.MutableList[com.cloudera.mypack.Product] 有没有办法可以将其转换为scala.collection.mutable.MutableList[com.cloudera.mypack.Product] 你不想那样做。可变列表是一种本地内存结构,不适用于大量数据。如果这会很大,您希望将其保留为 RDD。 谢谢史蒂夫。你是对的。现在我可以在不转换的情况下使用 RDD。 有没有办法在不为每列指定数据类型的情况下创建 RDD,例如当我们有大量列时?

以上是关于在scala中将Spark Dataframe转换为RDD的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spark 2 Scala 中将 Row 转换为 json

如何在 pyspark 中将 DenseMatrix 转换为 spark DataFrame?

如何在 Spark Scala 中将 WrappedArray 转换为 List?

如何在 Scala 中将数据帧转换为 Apache Spark 中的数据集?

如何在 Scala 中将 Spark DataFrames 一一添加到 Seq()

如何在 scala 中将 RDD[(int, string)] 转换为 Dataframe