pyspark insert overwrite select遇到的两个问题

有表达式必须带别名

看如下SQL

insert overwrite directory '/id1_id2_num'
row format delimited fields terminated by ','
select substr(str_id1, 4), substr(str_id2, 4), num
from someids

在 hue 执行没问题,但是 spark-submit 提交任务执行就会出错如下,原因未知。

Caused by: org.apache.spark.SparkException: 
Job aborted due to stage failure: 
Task 32 in stage 0.0 failed 4 times, most recent failure: Lost task 32.3 in stage 0.0 (TID 257, 172.21.1.168, executor 9): 
org.apache.hadoop.hive.serde2.SerDeException: 
org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe: 
columns has 7 elements while columns.types has 3 elements!

加上别名后就能正常执行:

insert overwrite directory '/id1_id2_num'
row format delimited fields terminated by ','
select substr(str_id1, 4) p1, 
substr(str_id2, 4) p2,
num
from someids

最好distribute控制结果的文件数量

insert overwrite select的操作,select结果的数据文件会和数据来源表的文件数量一样多。小文件数目过多,在跑完结果写文件的时候速度会令人发指地慢。在select语句末尾加上 distribute by FLOOR(rand()*1000)/200,能将结果文件数目控制在200以内。
这样做能加快insert overwrite的操作;如果insert overwrite的对象是另一张表,在对这个新表执行SQL时也会比众多小文件操作要快。也能基于这个规律使用distribute做HDFS的文件整理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值