将RDD转换为DataFrame

时间:2016-01-28 11:17:48

标签: apache-spark

您好我是Spark的新手,我正在尝试将rdd转换为数据帧.rdd是一个包含许多.txt文件的文件夹,每个文件都有一段文本。假设我的rdd是这个< / p>

val data = sc.textFile("data")

我想将数据转换为像这样的数据框

  +------------+------+
  |text        | code |  
  +----+-------+------|
  |data of txt1|  1.0 |
  |data of txt2|  1.0 |

所以专栏&#34;文字&#34;应该有每个txt文件的原始数据和列#34;代码&#34; 1.0 任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:4)

val data = sc.textFile("data.txt")

*// The schema is encoded in a string* 
val schemaString = "text code"

*// Import Row.*
import org.apache.spark.sql.Row;

*// Import Spark SQL data types*
import org.apache.spark.sql.types.{StructType,StructField,StringType};

*// Generate the schema based on the string of schema*
val schema = StructType( schemaString.split(" ").map(fieldName => StructField(fieldName, StringType, true)))

*// Convert records of the RDD (data) to Rows.*
val rowRDD = data.map(_.split(",")).map(p => Row(p(0), p(1).trim))

*// Apply the schema to the RDD.*
val dataDataFrame = sqlContext.createDataFrame(rowRDD, schema)

*// Register the DataFrames as a table.*
dataDataFrame.registerTempTable("data")

*// SQL statements can be run by using the sql methods provided by sqlContext.*
val results = sqlContext.sql("SELECT name FROM data")

从所有文件添加数据不是一个好主意,因为所有数据都将加载到内存中。一次一个文件将是一个更好的方法。

但同样取决于您的用例,如果您需要所有文件中的数据,则需要以某种方式附加rdds。

希望能回答你的问题! 干杯! :)

答案 1 :(得分:0)

Spark SQL可以使用“toDF”方法执行此操作

http://spark.apache.org/docs/latest/sql-programming-guide.html#inferring-the-schema-using-reflection

在你的情况下:

case class Data(text: String, code: Float)

val sqlContext = new org.apache.spark.sql.SQLContext(sc)
// this is used to implicitly convert an RDD to a DataFrame.
import sqlContext.implicits._

val data = sc.textFile("data")
val dataFrame = data.map(d => Data(d._1, d._2._foFloat)).toDF()