使用两个不同目录中的标头和数据创建DataFrame / Dataset

时间:2018-06-06 18:30:01

标签: scala apache-spark apache-spark-sql

我将输入文件作为CSV。这里我得到两个目录,第一个目录将有一个带有头记录的文件,第二个目录将有数据文件。在这里,我想创建一个Dataframe / Dataset。

我可以做的一种方法是创建案例类并通过分隔符拆分数据文件并附加架构并创建dataFrame。

我正在寻找的是读取头文件和数据文件并创建dataFrame。我看到了使用数据库的解决方案,但我的组织限制使用数据库,下面是我遇到的代码。您可以在不使用数据库的情况下帮助我解决方案。

val headersDF = sqlContext
  .read
  .format("com.databricks.spark.csv")
  .option("header", "true")
  .load("path to headers.csv")

val schema = headersDF.schema

val dataDF = sqlContext
  .read
  .format("com.databricks.spark.csv")
  .schema(schema)
  .load("path to data.csv")

2 个答案:

答案 0 :(得分:0)

你可以这样做

 val schema=spark
.read
.format("csv")
.option("header","true")
.option("delimiter",",")
.load("C:\\spark\\programs\\empheaders.csv")
.schema

val data=spark
.read
.format("csv")
.schema(schema)
.option("delimiter",",")
.load("C:\\spark\\programs\\empdata.csv")

答案 1 :(得分:0)

因为在标题CSV文件中您没有任何数据,所以没有必要从中推断出架构。 所以只需通过阅读即可获得字段名称。

val headerRDD = sc.parallelize(Seq(("Name,Age,Sal"))) //Assume this line is in your Header CSV
val header = headerRDD.flatMap(_.split(",")).collect

//headerRDD: org.apache.spark.rdd.RDD[String] = ParallelCollectionRDD[70] at parallelize at command-2903591155643047:1
//header: Array[String] = Array(Name, Age, Sal)     

然后读取数据CSV文件。 将每一行映射到案例类或元组。通过传递标题数组将数据转换为DataFrame。

val dataRdd = sc.parallelize(Seq(("Tom,22,500000"),("Rick,40,1000000"))) //Assume these lines are in your data CSV file
val data = dataRdd.map(_.split(",")).map(x => (x(0),x(1).toInt,x(2).toDouble)).toDF(header: _*)

//dataRdd: org.apache.spark.rdd.RDD[String] = ParallelCollectionRDD[72] at parallelize at command-2903591155643048:1
//data: org.apache.spark.sql.DataFrame = [Name: string, Age: int ... 1 more field]  

结果:

data.show() 
+----+---+---------+
|Name|Age|      Sal|
+----+---+---------+
| Tom| 22| 500000.0|
|Rick| 40|1000000.0|
+----+---+---------+