Логическое чтение файла последовательности с Int и String,

Тогда, если я сделаю это:

val sequence_data = sc.sequenceFile("/seq_01/seq-directory/*", classOf[IntWritable], classOf[Text])
                  .map{case (x, y) => (x.toString(), y.toString().split("/")(0), y.toString().split("/")(1))}
                  .collect

Это нормально, поскольку IntWritable преобразуется в String.

Если я сделаю это:

val sequence_data = sc.sequenceFile("/seq_01/seq-directory/*", classOf[IntWritable], classOf[Text])
                  .map{case (x, y) => (x, y.toString().split("/")(0), y.toString().split("/")(1))}
                  .collect 

То я сразу получаю эту ошибку:

org.apache.spark.SparkException: Job aborted due to stage failure: Task 5.0 in stage 42.0 (TID 692) had a not serializable result: org.apache.hadoop.io.IntWritable

Основная причина не совсем ясна - сериализация, но почему так сложно? Я обращаю внимание на еще один аспект сериализации. Также это отмечается только во время выполнения.

0
thebluephantom 10 Ноя 2018 в 17:06

1 ответ

Лучший ответ

Если цель состоит в том, чтобы просто получить целочисленное значение, вам нужно будет вызвать get для записываемого

.map{case (x, y) => (x.get()

Затем JVM выполняет сериализацию объекта Integer вместо того, чтобы не знать, как обрабатывать IntWritable, потому что не реализует интерфейс Serializable

String реализует Serializable

2
OneCricketeer 10 Ноя 2018 в 14:16