您好我是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 任何帮助将不胜感激。
答案 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()