我想使用case类将textfile转换为dataframe,下面是我的代码。它可以工作直到地图分割,我可以使用rdd_metadata_schema.take(1).foreach(arr => print(arr.toList))
查看值,但在检查数据帧时它是空的。
case class metadata_schema(
field_name:String,
field_pos:String,
field_dataType:String
)
val rdd_metadata = Spark.sparkSession.sparkContext.textFile("textfile")
val rdd_metadata_schema = rdd_metadata.map(row => row.split('|')).map(field => metadata_schema(field(0), field(1), field(2)))
val df_metadata = Spark.sparkSession.createDataFrame(rdd_metadata_schema,classOf[metadata_schema])
**textfile:**
field1|1-2|String
field2|3|String
一切看起来都不错。我想只使用case类创建df,因为另一种方法适合我。这是为了更新我的技能。
答案 0 :(得分:3)
你就是这样做的
case class metadata_schema(
field_name:String,
field_pos:String,
field_dataType:String
)
确保案例类在对象之外。
val spark = SparkSession.builder().appName("test").master("local").getOrCreate()
import spark.implicits._
val rdd_metadata = spark.sparkContext.textFile("file path")
val rdd_metadata_schema = rdd_metadata.map(row => row.split('|')).map(field => metadata_schema(field(0), field(1), field(2)))
//you don't need to create using createDataFrame() just toDF is sufficient
rdd_metadata_schema.toDF().show()
输出:
+----------+---------+--------------+
|field_name|field_pos|field_dataType|
+----------+---------+--------------+
| field1| 1-2| String|
| field2| 3| String|
+----------+---------+--------------+
答案 1 :(得分:1)
如果您使用的是Spark 2,则使用数据集的方法更简单:
val revenues = spark
.read
.format("csv")
.option("delimiter", "|")
.option("header", "true")
.load("textfile")
.as[metadata_schema]
.toDF()
答案 2 :(得分:1)
在case class
中使用rdd
时(正如您所做的那样),已使用rdd上的反射创建schema
,因此您不必使用sqlContext
和schema
创建数据框。
只做
import sqlContext.implicits._
rdd_metadata_schema.toDF().show(false)
你应该
+----------+---------+--------------+
|field_name|field_pos|field_dataType|
+----------+---------+--------------+
|field1 |1-2 |String |
|field2 |3 |String |
+----------+---------+--------------+
string.split()也是这样说的
Spark SQL的Scala接口支持自动将包含RDD的案例类转换为DataFrame。 case类定义表的模式。使用反射读取case类的参数名称,并成为列的名称。 ...
您甚至可以将dataset
创建为
import sqlContext.implicits._
rdd_metadata_schema.toDS().show(false)
我希望答案很有帮助