spark sql之hint 学习

spark sql之hint 学习,第1张

spark sql之hint 学习

官网永远是学习的最好地方。

Hints - Spark 3.2.0 documentationhttps://spark.apache.org/docs/latest/sql-ref-syntax-qry-select-hints.html

    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 dataset = session.sql("select " +
                "concat( biz_id,'----',concat_ws(',',collect_list(src_supplier_id))) src_supplier_idsn" +
                "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 dataset2 = session.sql("select   " +
                "concat( biz_id,'----',concat_ws(',',collect_list(src_supplier_id))) src_supplier_idsn" +
                "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  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个。)

其实这里涉及到了一个资源的浪费。正确的做法是 *

其实这是spark sql的写法。如果我熟悉了 df ds 的写法,也可以重分区


 但是这里又涉及到一个代码直观性。

还有个方法可以看出是hint是否成功。代码里也写了 explain

common

 hint的

结语 其实这个在ds df 里都可以用的。只不过spark sql里写起来更加直观。

学习这个的目的是因为看了一篇好文章。分享给大家

AI & 大数据 - 专区 - OSCHINA - 中文开源技术交流社区Artificial Intelligence 人工智能是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。大数据(big data),是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。AI 研究通常需要大量数据支撑。https://www.oschina.net/group/ai-bigdata?circle=big-data

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5717167.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-18
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存