Вы должны cast
или использовать schema
при импорте CSV
файла через Informatica . Поскольку формат Spark ORC
не infer Schema
автоматически, как формат Spark CSV
. Формат ORC берет схему из схемы исходного файла как есть.
Поскольку вы не использовали schema
в Informatica , в нем по умолчанию записаны данные String
DataType, который далее используетсяна ORC
.
Существует два возможных способа решения проблемы:
Либо используйте схему в файле CSV (преобразуйте столбцы, которые должны иметь тип данных, отличный от String
) в Informatica
/ Spark
и загрузите в ORC
.
Или используйте Struct
или Casting
в Spark, чтобы изменить тип данных файла ORC
для необходимых столбцов.
Пример демонстрации:
Ниже приведен пример демонстрации работы искры с Schema
. Вы можете напоминать логику схемы исходного CSV
файла в Informatica
, как и Spark
, как показано ниже
Случай 1: загрузка файла CSV по умолчанию и запись в ORC
scala> val df = spark.read.format("csv").option("header","true").load("/spath/stack2.csv")
//Default schema uses by Spark or Informatica for CSV file
scala> df.printSchema
root
|-- ID: string (nullable = true)
|-- Course: string (nullable = true)
|-- Enrol_Date: string (nullable = true)
|-- Credits: string (nullable = true)
//Have loaded same CSV file into ORC
scala> df.write.format("orc").mode("overwrite").save("/spath/AP_ORC")
scala> val orc = spark.read.format("orc").load("/spath/AP_ORC")
//Schema is same as Source CSV file
scala> orc.printSchema
root
|-- ID: string (nullable = true)
|-- Course: string (nullable = true)
|-- Enrol_Date: string (nullable = true)
|-- Credits: string (nullable = true)
Случай 2: Преобразование / вывод типа данных схемы для файла CSV и запись в ORC
//Inferring Schema or Transform/casting of CSV data in Spark or Informatica respectively.
scala> val df = spark.read.format("csv").option("header","true").option("inferschema", "true").load("/spath/stack2.csv")
//Transformed Schema
scala> df.printSchema
root
|-- ID: integer (nullable = true)
|-- Course: string (nullable = true)
|-- Enrol_Date: string (nullable = true)
|-- Credits: integer (nullable = true)
//Have loaded same CSV file into ORC
scala> df.write.format("orc").mode("overwrite").save("/spath/AP_ORC")
scala> val orc = spark.read.format("orc").load("/spath/AP_ORC")
//Schema is same as Source CSV file
scala> orc.printSchema
root
|-- ID: integer (nullable = true)
|-- Course: string (nullable = true)
|-- Enrol_Date: string (nullable = true)
|-- Credits: integer (nullable = true)