Поддержка смены типа в свечном паркете - PullRequest
0 голосов
/ 31 августа 2018

Я столкнулся с одной проблемой при чтении паркета через искру.

Один файл паркета был записан с полем a типа Integer. После этого чтение этого файла со схемой для a как Long дает исключение.

Причина: java.lang.UnsupportedOperationException: не реализовано Тип: LongType в org.apache.spark.sql.execution.datasources.parquet.VectorizedColumnReader.readIntBatch (VectorizedColumnReader.java:397) в org.apache.spark.sql.execution.datasources.parquet.VectorizedColumnReader.readBatch (VectorizedColumnReader.java:199) в org.apache.spark.sql.execution.datasources.parquet.VectorizedParquetRecordReader.nextBatch (VectorizedParquetRecordReader.java:263) в org.apache.spark.sql.execution.datasources.parquet.VectorizedParquetRecordReader.nextKeyValue (VectorizedParquetRecordReader.java:161) в org.apache.spark.sql.execution.datasources.RecordReaderIterator.hasNext (RecordReaderIterator.scala: 39) в org.apache.spark.sql.execution.datasources.FileScanRDD $$ Анон $ 1.hasNext (FileScanRDD.scala: 106)

Я думал, что это совместимое изменение типа поддерживается. Но это не работает.

Фрагмент кода:

val oldSchema = StructType(StructField("a", IntegerType, true) :: Nil)

val df1 = spark.read.schema(oldSchema).json("/path/to/json/data")

df1.write.parquet("/path/to/parquet/data")

val newSchema = StructType(StructField("a", LongType, true) :: Nil)

spark.read.schema(newSchema).parquet("/path/to/parquet/data").show()

Любая помощь в этом деле очень ценится.

1 Ответ

0 голосов
/ 31 августа 2018

как паркет - это формат хранения на основе столбцов для Hadoop, поэтому он также сохраняет тип данных. Таким образом, при чтении паркета с другим типом данных, даже если он выкачивается, он не обрабатывается автоматически.

Вам необходимо специально привести данные

val colarraywithcast = Array (col («eid»), col («did»), col («seal»). Cast (LongType))

df.select (colarraywithcast: _ *) printSchema

.
...