2017-02-02 6 views
0

У меня есть файл CSV с 10 столбцами. Половина строк и половина - это целые числа.Как создать схему из файла CSV и сохранить/сохранить эту схему в файл?

Что код Scala в:

  • Создать (Infer) схемы
  • Сохранить эту схему в файл

меня это до сих пор:

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") 

И каков наилучший формат файла для сохранения этой схемы? Это JSON?

Цель - я хочу создать схему только один раз и в следующий раз при загрузке из файла вместо повторного создания его на лету.

Спасибо.

ответ

1

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) 

В зависимости от вас требований вы можете использовать standard Scala methods to write this to file или взломать Спарк 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