如何从CSV文件创建模式并将该模式​​持久/保存到文件?

Joe*_*Joe 2 schema scala apache-spark

我有10列的CSV文件。Half String和Half是Integers。

什么是Scala代码以:

  • 创建(推断)架构
  • 将该架构保存到文件

到目前为止,我有:

import org.apache.spark.sql.SQLContext

val sqlContext = new SQLContext(sc)
val df = sqlContext.read
    .format("com.databricks.spark.csv")
    .option("header", "true") // Use first line of all files as header
    .option("inferSchema", "true") // Automatically infer data types
    .load("cars.csv")
Run Code Online (Sandbox Code Playgroud)

保存该模式的最佳文件格式是什么?是JSON吗?

目标是-我只想创建一次架构,下一次从文件中加载,而不是即时重新创建。

谢谢。

use*_*411 5

DataType API提供了所有必需的实用程序,因此JSON是自然选择:

import org.apache.spark.sql.types._
import scala.util.Try

val df = Seq((1L, "foo", 3.0)).toDF("id", "x1", "x2")
val serializedSchema: String = df.schema.json


def loadSchema(s: String): Option[StructType] =
  Try(DataType.fromJson(s)).toOption.flatMap {
    case s: StructType => Some(s)
    case _ => None 
  }

loadSchema(serializedSchema)
Run Code Online (Sandbox Code Playgroud)

根据您的要求,您可以使用标准的Scala方法将其写入文件,或入侵Spark RDD

val schemaPath: String = ???

sc.parallelize(Seq(serializedSchema), 1).saveAsTextFile(schemaPath)
val loadedSchema: Option[StructType] = sc.textFile(schemaPath)
  .map(loadSchema)  // Load
  .collect.headOption.flatten  // Make sure we don't fail if there is no data
Run Code Online (Sandbox Code Playgroud)

对于等效的Python,请参阅配置文件以在PySpark中定义JSON模式结构