spark sql 报错:java.lang.IndexOutOfBoundsException: toIndex = 5

字面意思就是数组下标超了,这个越界的原因是:spark dataframe在写数据到hadoop的时候,在存储文件中把分区字段也写进去了,正确的是分区字段不能写到文件中,而是作为文件目录。

以下是错误的代码:

case class myrow(pin:String, tag:String, dt:String)
rdd.map(x=>myrow(x._1,x._2,yesterday)).toDF().write.save(path+s"dt=$yesterday")

可以看到,dataframe中包含dt这个分区字段,同时保存的路径里也包含这个dt字段,所以正确的做法是调用dataframe的partitionBy接口,保存路径不用指定分区字段:

rdd.map(x=>myrow(x._1,x._2,yesterday)).toDF().write.partitionBy("dt").save(path)

另外,比较奇怪的一点是:刚开始错误的保存后,HIVE依然可以正常读数,但是spark sql不可以,还以为碰到什么大bug了。。

你可能感兴趣的:(spark,hive)