官网永远是学习的最好地方。
public static void main(String[] args) throws KuduException, InterruptedException {
SparkConf sparkConf = new SparkConf().setMaster("yarn").setAppName("KuduCompareHive");
if (System.getProperty("os.name").toLowerCase().contains("windows")) {
sparkConf = new SparkConf().setMaster("local[*]").setAppName("dp");
sparkConf.set("spark.driver.memory", "1g").set("spark.testing.memory", "1073740000");
//这个是我本地认证kerberos集群的代码。不认证不用管
//kerberos_auth();
}
SparkSession session = SparkSession.builder().config(sparkConf)
.enableHiveSupport().getOrCreate();
Dataset<Row> dataset = session.sql("select " +
"concat( biz_id,'----',concat_ws(',',collect_list(src_supplier_id))) src_supplier_ids\n" +
"from dwiadata.ia_fdw_hr_company_contact_info_relation_detail" +
" group by biz_id ");
dataset.explain(true);
dataset.write().mode(SaveMode.Overwrite).text("file:///D:\\install\\code\\tencent\\dw_ia_portraitsearch\\output\\common");
Dataset<Row> dataset2 = session.sql("select /*+REPARTITION(10) */ " +
"concat( biz_id,'----',concat_ws(',',collect_list(src_supplier_id))) src_supplier_ids\n" +
"from dwiadata.ia_fdw_hr_company_contact_info_relation_detail" +
" group by biz_id ");
dataset2.explain(true);
dataset2.write().mode(SaveMode.Overwrite).text("file:///D:\\install\\code\\tencent\\dw_ia_portraitsearch\\output\\hint");
Thread.sleep(Integer.MAX_VALUE);
session.close();
}
上述注意下 我是直接写成text了 方便阅读。 file:///是写到本地windows的 都是为了方便观察。
第一个sql就是普通的 select biz_id,src_supplier_id from t group by biz_id
第二个sql就是hint的 select /*+REPARTITION(10) */biz_id,src_supplier_id from t group by biz_id
可以看到hint后的sql任务 多了一个stage,就是将原先的200个task repartition成了10个。
输出的文件也很有意思
可以看到common的是0,46,61,139,160,198
hint的是0 1 4 6 8 9
对比common是200个分区,hint的是10个分区,其实就是task编号
因为我group biz_id 实际上biz_id只有5个。。。所以最后只会形成5条记录,也就是如果用200个task去跑 实际只会有5个task任务运行。其余的都是空转
这里注意下000这个文件会始终存在 ,所以5个task 6个文件,0是空文件
如下图。(这里是我又跑了一次。所以task重新分配。。。反正还是5个。)
其实这里涉及到了一个资源的浪费。正确的做法是/*+ COALESCE(5) */ *
其实这是spark sql的写法。如果我熟悉了 df ds 的写法,也可以重分区
但是这里又涉及到一个代码直观性。
还有个方法可以看出是hint是否成功。代码里也写了 explain
common
hint的
结语 其实这个在ds df 里都可以用的。只不过spark sql里写起来更加直观。
学习这个的目的是因为看了一篇好文章。分享给大家