У меня есть фрагмент кода искры, который записывает в паркет с предопределенной схемой. У меня есть внешний стол улья сверху паркета. Теперь я хочу изменить тип данных базового паркета одного столбца с String на Integer. Я попытался выполнить mergeSchema, но его ошибка завершилась с ошибкой
. Причина: org. apache .spark.SparkException: не удалось объединить поля 'salary' и 'salary'. Не удалось объединить несовместимые типы данных StringType и IntegerType
. Ниже приведен фрагмент кода
**SCALA CODE SNIPPET**
import org.apache.spark.sql.types._
import org.apache.spark.sql._
import spark.sqlContext.implicits._
import org.apache.spark.sql.Row
val someData = Seq(ow("Doe","Jones","223","M")
)
val someSchema = List(
StructField("firstname", StringType, true),
StructField("lastname", StringType, true),
StructField("salary",StringType,true),
StructField("gender",StringType,true)
)
val someDF = spark.createDataFrame(
spark.sparkContext.parallelize(someData),
StructType(someSchema)
)
someDF.write.mode("append").parquet("/test")
ВНЕШНЯЯ ТАБЛИЦА HIVE
drop table test;
create external table test(firstname string
,lastname string
,salary int
,gender string)
STORED AS PARQUET
LOCATION '/test';
Все хорошо, я могу сделать запрос из таблицы улья. выберите * из теста;
+-----------------+----------------+--------------+--------------+--+
| test.firstname | test.lastname | test.salary | test.gender |
+-----------------+----------------+--------------+--------------+--+
| Doe | Jones | 223 | M |
+-----------------+----------------+--------------+--------------+--+
Теперь я хочу изменить тип данных столбца зарплаты с String на Integer. Я ожидаю, что когда я добавлю новую строку, метаданные паркета будут обновлены и с этого времени будут использовать этот тип данных
val someData = Seq(
Row("Jam","Kas",223,"M")
)
val someSchema = List(
StructField("firstname", StringType, true),
StructField("lastname", StringType, true),
StructField("salary",IntegerType,true),
StructField("gender",StringType,true)
)
val someDF = spark.createDataFrame(
spark.sparkContext.parallelize(someData),
StructType(someSchema)
)
someDF.write.mode("append").parquet("/test")
Теперь запросите таблицу улья. Ниже приводится ошибка
msck repair table test;
select * from test;
Error: java.io.IOException: org.apache.hadoop.hive.ql.metadata.HiveException: java.lang.ClassCastException: org.apache.hadoop.io.Text cannot be cast to org.apache.hadoop.io.IntWritable (state=,code=0)