невозможно изменить тип столбца таблицы улья на паркете - PullRequest
0 голосов
/ 22 января 2020

У меня есть фрагмент кода искры, который записывает в паркет с предопределенной схемой. У меня есть внешний стол улья сверху паркета. Теперь я хочу изменить тип данных базового паркета одного столбца с 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)
...