Spark:使用案例类将文本文件转换为Dataframe

时间:2018-03-20 15:02:57

标签: apache-spark

我想使用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,因为另一种方法适合我。这是为了更新我的技能。

3 个答案:

答案 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,因此您不必使用sqlContextschema创建数据框。

只做

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)

我希望答案很有帮助