最近做spark sql开发碰到了许多问题,下面对报错信息做下记录
1, StructType can not accept object in type <type 'int'>
将RDD创建成DataFrame的时候,报上述错误,修正方式如下:
将RDD中的行转换成Row类型就可以了
数据是double类型,并且已经指定double类型
因为RDD中的dict元素的数据类型可以不同,但是在Hive表中的map类型必须相同,当要将RDD数据以Map的格式存储到Hive表中的时候,dict格式需要统一
改成string通用格式即可
3,registerTempTable table not found
将dataframe注册成表后,再次使用该表的时候,系统容易报出table not found 错误
错误原因如下:
Sc=sparkContext(appName=”a”)
sqlContext=HiveContext(sc)
sqlContext.sql(“usegfrobdb2”)
hc=HiveContext(sc)
后面的dataframe是由sqlcontext创建的,当将dataframe注册成表后,sqlContext将无法再次使用该表,只有hc可以使用,应该是注册表时的当前HiveContext是hc,而创建dataframe的时候是sqlContext。将最后一句代码注释掉即可解决问题
4,RDD is empty
RDD转换成DataFrame 有多种方式,当不指定数据类型的时候,如果RDD为空,spark会报错,因为推测数据类型需要访问部分抽样数据
解决办法:转换的时候指定数据类型即可,使用StructType方式