Apache spark 不可序列化结果:使用Spark/Scala读取序列文件时org.apache.hadoop.io.IntWritable
从逻辑上读取带有Int和String的序列文件 如果我这样做:Apache spark 不可序列化结果:使用Spark/Scala读取序列文件时org.apache.hadoop.io.IntWritable,apache-spark,hadoop,serialization,sequencefile,Apache Spark,Hadoop,Serialization,Sequencefile,从逻辑上读取带有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))}
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
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
这是正常的,因为IntWritable已转换为字符串
如果我这样做:
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
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
根本原因并不十分清楚——序列化,但为什么如此困难?这是我注意到的另一种序列化方面。另外,它只在运行时才会被注意到。如果目标是只获取一个整数值,那么您需要在可写文件上调用get
.map{case (x, y) => (x.get()
然后JVM处理而不是不知道如何处理IntWritable,因为
如果目标是只获取一个整数值,则需要在可写对象上调用get
.map{case (x, y) => (x.get()
然后JVM处理而不是不知道如何处理IntWritable,因为
嗯,字符串是Serializable的子类,IntWritable不是。因此,读取序列文件意味着所有方面都应该设置为字符串,然后从那里开始进行处理和转换?不,您可以
x.get()
,那么整数也可以序列化(并且序列化字符串的开销更小)。我在本例中使用了get()。好的,明白了!你也可以做一个回答。字符串是Serializable的子类,intwriteable不是。因此,读取序列文件意味着所有方面都应该设置为字符串,然后从那里开始进行处理和转换?不,您可以x.get()
,那么整数也可以序列化(并且序列化字符串的开销更小)。我在本例中使用了get()。好的,明白了!你不妨回答一下