有表达式必须带别名
看如下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的文件整理。