zoukankan      html  css  js  c++  java
  • sparkSQL将谓词推入kudu引擎

    kudu之所以执行非常快速,可以用来替代HDFS和Hbase等,一个主要原因是,我们可以将普通SQL中的谓词推入kudu引擎,这样kudu查询数据会变的非常快;

    将谓词评估推入Kudu引擎可以提高性能,因为它可以减少需要流回Spark引擎以进行进一步评估和处理的数据量。

    通过Spark API当前支持谓词下推的谓词集包括:

    等于(=)
    
    大于(>)
    
    大于或等于(> =)
    
    小于(<)
    
    小于等于(<=)

    因此,Spark SQL中的这些语句会将谓词评估推向Kudu的存储引擎,从而提高整体性能。

    import org.apache.kudu.spark.kudu._
    import org.apache.spark.{SparkConf, SparkContext}
    import org.apache.spark.sql.SparkSession
    
    /**
      * Created by angel;
      */
    object Predicate_pushDown {
      def main(args: Array[String]): Unit = {
        val sparkConf = new SparkConf().setAppName("AcctfileProcess")
          //设置Master_IP并设置spark参数
          .setMaster("local")
          .set("spark.worker.timeout", "500")
          .set("spark.cores.max", "10")
          .set("spark.rpc.askTimeout", "600s")
          .set("spark.network.timeout", "600s")
          .set("spark.task.maxFailures", "1")
          .set("spark.speculationfalse", "false")
          .set("spark.driver.allowMultipleContexts", "true")
          .set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
        val sparkContext = SparkContext.getOrCreate(sparkConf)
        val sqlContext = SparkSession.builder().config(sparkConf).getOrCreate().sqlContext
        //使用spark创建kudu表
        val kuduMasters = "hadoop01:7051,hadoop02:7051,hadoop03:7051"
        val kuduContext = new KuduContext(kuduMasters, sqlContext.sparkContext)
        //TODO 1:定义kudu表
        val kuduTableName = "spark_kudu_tbl"
        //TODO 2:配置kudu参数
        val kuduOptions: Map[String, String] = Map(
          "kudu.table"  -> kuduTableName,
          "kudu.master" -> kuduMasters)
    
        //TODO 3:注册kudu表作为spark的临时表
        sqlContext.read.options(kuduOptions).kudu.registerTempTable(kuduTableName)
    
        //TODO 4:执行sparkSQL语句,spark会自动将谓词推入kudu引擎
        val customerNameAgeDF = sqlContext.
          sql(s"""SELECT name, age FROM $kuduTableName WHERE age >= 30""")
    
        //TODO 5:展示结果
        customerNameAgeDF.show()
        //TODO 6:使用sparkSQL的查询计划
        customerNameAgeDF.explain()
      }
    }

    可以看到查询计划:

    == Physical Plan == Scan org.apache.kudu.spark.kudu.KuduRelation@781dbe44 [name#0,age#1] PushedFilters: [IsNotNull(age), *GreaterThanOrEqual(age,30)], ReadSchema: structname:string,age:int

     

  • 相关阅读:
    PhpStudy升级MySQL5.7
    C# 字符串操作详解
    字符串留用与字符串池
    C# 字符串操作基本过程(Equals、Compare、EndsWith等处理方法)
    CLR关于语言文化的类型一CultureInfo类和字符串与线程的关联
    字符、字符串和文本的处理之Char类型
    二、LINQ之查询表达式基础
    一、Linq简介
    Unity学习系列一简介
    C# 静态构造函数
  • 原文地址:https://www.cnblogs.com/niutao/p/10555379.html
Copyright © 2011-2022 走看看