Как создать файл схемы в Spark - PullRequest
0 голосов
/ 24 мая 2018

Я пытаюсь прочитать файл схемы (который является текстовым файлом) и применить его к моему CSV-файлу без заголовка.Поскольку у меня уже есть файл схемы, я не хочу использовать опцию InferSchema, которая является служебной.

Мой файл входной схемы выглядит следующим образом:

"num IntegerType","letter StringType"

Я пытаюсьниже код для создания файла схемы,

val schema_file = spark.read.textFile("D:\\Users\\Documents\\schemaFile.txt")
val struct_type = schema_file.flatMap(x => x.split(",")).map(b => (b.split(" ")(0).stripPrefix("\"").asInstanceOf[String],b.split(" ")(1).stripSuffix("\"").asInstanceOf[org.apache.spark.sql.types.DataType])).foreach(x=>println(x))

Я получаю сообщение об ошибке, как показано ниже

Exception in thread "main" java.lang.UnsupportedOperationException: No Encoder found for org.apache.spark.sql.types.DataType

- поле (класс: "org.apache.spark.sql.types.DataType", name:" _2 ") - корневой класс:" scala.Tuple2 "

и пытается использовать его как файл схемы, используя spark.read.csv, как показано ниже, и записать его как файл ORC

  val df=spark.read
      .format("org.apache.spark.csv")
      .option("header", false)
      .option("inferSchema", true)
      .option("samplingRatio",0.01)
      .option("nullValue", "NULL")
      .option("delimiter","|")
      .schema(schema_file)
      .csv("D:\\Users\\sampleFile.txt")
      .toDF().write.format("orc").save("D:\\Users\\ORC")

Нужна помощь для преобразования текстового файла в файл схемы и преобразования моего входного CSV-файла в ORC.

Ответы [ 3 ]

0 голосов
/ 14 января 2019

Что-то вроде этого немного более устойчиво, так как в нем используется метасторье улья:

    import org.apache.hadoop.hive.metastore.api.FieldSchema
    def sparkToHiveSchema(schema: StructType): List[FieldSchema] ={
        schema.map(field => new FieldSchema(field.name,field.dataType.catalogString,field.getComment.getOrElse(""))).toList
    }
``


0 голосов
/ 22 мая 2019

Вы можете указать схему следующим образом:

import org.apache.spark.sql.types.{StructType, StructField, StringType,IntegerType}; 

Например:

val schema = new StructType(
Array(
   StructField("Age",IntegerType,true),
  StructField("Name",StringType,true),
  )
)

val data = spark.read.option("header", "false").schema(schema).csv("filename.csv")
data.show()

Это непосредственно создаст ее в кадре данных

0 голосов
/ 24 мая 2018

Чтобы создать схему из файла text, создайте функцию для match type и верните DataType как

def getType(raw: String): DataType = {
  raw match {
    case "ByteType" => ByteType
    case "ShortType" => ShortType
    case "IntegerType" => IntegerType
    case "LongType" => LongType
    case "FloatType" => FloatType
    case "DoubleType" => DoubleType
    case "BooleanType" => BooleanType
    case "TimestampType" => TimestampType
    case _ => StringType
  }
}

Теперь создайте схему, прочитав файл схемы как

val schema = Source.fromFile("schema.txt").getLines().toList
  .flatMap(_.split(",")).map(_.replaceAll("\"", "").split(" "))
  .map(x => StructField(x(0), getType(x(1)), true))

Теперь прочитайте CSV-файл как

spark.read
  .option("samplingRatio", "0.01")
  .option("delimiter", "|")
  .option("nullValue", "NULL")
  .schema(StructType(schema))
  .csv("data.csv")

Надеюсь, это поможет!

...