Hive

Hive sql和Presto sql的一些对比

谁都会走 提交于 2020-05-07 21:19:09
最近由于工作上和生活上的一些事儿好久没来博客园了,但是写博客的习惯还是得坚持,新的一年需要更加努力,困知勉行,终身学习,每天都保持空杯心态.废话不说,写一些最近使用到的Presto SQL和Hive SQL的体会和对比. ###一.JSON处理对比 Hive select get_json_object(json, '$.book'); Presto select json_extract_scalar(json, '$.book'); 注意这里Presto中json_extract_scalar返回值是一个string类型,其还有一个函数json_extract是直接返回一个json串,所以使用的时候你得自己知道取的到底是一个什么类型的值. ###二.列转行对比 Hive select student, score from tests lateral view explode(split(scores, ',')) t as score; Presto select student, score from tests cross json unnest(split(scores, ',') as t (score); 简单的讲就是将scores字段中以逗号隔开的分数列比如 80,90,99,80 这种单列的值转换成和student列一对多的行的值映射. ###三

presto调研和json解析函数的使用

江枫思渺然 提交于 2020-05-07 20:32:01
presto简单介绍 presto是一个分布式的sql交互式查询引擎。可以达到hive查询效率的5到10倍。支持多种数据源的秒级查询。 presto是基于内存查询的,这也是它为什么查询快的原因。除了基于内存,presto还使用了 向量计算, 动态编译执⾏计划 优化的ORC和Parquet Reader技术 从而优化查询的速度。 presto和hive的对比 hive和presto是针对不同使用场景的。presto虽然查询很快,但是也不是适用于所有的查询场景。 比如做多张大表的关联查询, 由于presto是基于内存查询的。做大表关联查询时,数据要加载到内存中,假如使用presto查询超过了几分钟才会有返回。 且严重影响集群的性能。这就违背了presto交互式查询的初衷,交互式就是要做到近实时查询与返回。 所以,presto不适合做多张大表的join操作或者ETL操作。这种情况就该使用hive了。 另外,hive只能做hdfs查询(es等需要插件支持),而presto支持了mysql,pg,kafka,redis等。 总之,presto是支持多数据源的查询利器。 适用场景 presto不应作为etl工具,和做多表关连查询。而应该更多的作为单表的查询操作。 结合我们的业务场景,不难想到,presto适用的场景是 在数仓的前两层,presto可以做验数,查询某条数据使用;

SparkSQL的一些用法建议和Spark的性能优化

两盒软妹~` 提交于 2020-05-07 17:35:59
####1.写在前面 Spark是专为大规模数据处理而设计的快速通用的计算引擎,在计算能力上优于MapReduce,被誉为第二代大数据计算框架引擎。Spark采用的是内存计算方式。Spark的四大核心是Spark RDD(Spark core),SparkSQL,Spark Streaming,Spark ML。而SparkSQL在基于Hive数仓数据的分布式计算上尤为广泛。本编博客主要介绍基于Java API的SparkSQL的一些用法建议和利用Spark处理各种大数据计算的性能优化建议 ####2.SparkSQL的一些用法及建议 实例化SparkSSql的SparkSession,Spark2.0之后都是利用SparkSession来进行SparkSQL,2.0以前是利用SparkSQLContext SparkConf conf = new SparkConf().setAppName("sql-app"); setSparkConf(parameterParse, conf); JavaSparkContext jsc = new JavaSparkContext(conf); SparkSession.clearDefaultSession(); SparkSession session = SparkSession.builder().appName

Spark 知识点总结--调优(一)

风格不统一 提交于 2020-05-07 16:33:50
搭建集群: SPARK_WORKER-CORES : 当计算机是32核双线程的时候,需要指定SPARK_WORKER_CORES的个数为64个 SPARK_WORKER_MEMORY : 任务提交: ./spark-submit --master node:port --executor-cores --class ..jar xxx --executor-cores: 指定每个executor使用的core 的数量 --executor-memory: 指定每个executor最多使用的内存 --total-executor-cores: standalone 集群中 spark application 所使用的总的core --num-executor : 在yarn 中为 spark application 启动的executor --Driver-cores: driver使用的core --Driver-memory: driver使用的内存 以上的参数是在spark-submit 提交任务的时候指定的,也可以在spark-defaults.xml中进行配置 spark 并行度调优: (一般在做测试的时候使用) sc.textFile(xx,minnum) sc.parallelize(seq,num) sc.makeRDD(seq,num) sc

Spark实践 -- 性能优化基础

我只是一个虾纸丫 提交于 2020-05-07 13:56:01
性能调优相关的原理讲解、经验总结; 掌握一整套Spark企业级性能调优解决方案;而不只是简单的一些性能调优技巧。 针对写好的spark作业,实施一整套数据倾斜解决方案:实际经验中积累的数据倾斜现象的表现,以及处理后的效果总结。 调优前首先要对spark的作业流程清楚: Driver到Executor的结构; Master: Driver |-- Worker: Executor |-- job |-- stage |-- Task Task 一个Stage内, 最终的RDD有多少个partition,就会产生多少个task ,一个task处理一个partition的数据; 作业划分为task分到Executor上,然后一个cpu core执行一个task; BlockManager负责Executor,task的数据管理,task来它这里拿数据; 1.1 资源分配 性能调优的王道:分配更多资源。 分配哪些资源? executor、cpu per executor、memory per executor、driver memory 在哪里分配这些资源? 在我们在生产环境中,提交spark作业时,用的spark-submit shell脚本,里面调整对应的参数 /usr/local/spark/bin/spark-submit \ --class cn.spark.sparktest

Hive实现update和delete

北城余情 提交于 2020-05-07 13:21:47
业务需求,要CDH版HIVE支持update和delete(参考如下文章,完美成功) https://blog.csdn.net/xueyao0201/article/details/79387647 例如: -- 建立非分区表并加载数据 CREATE TABLE t1 (id INT, name STRING, cty STRING, st STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ','; LOAD DATA LOCAL INPATH '/home/grid/a.txt' INTO TABLE t1; SELECT * FROM t1; -- 建立外部分区事务表并加载数据 CREATE EXTERNAL TABLE t2 (id INT, name STRING) PARTITIONED BY (country STRING, state STRING) CLUSTERED BY (id) INTO 8 BUCKETS STORED AS ORC TBLPROPERTIES ('transactional'='true'); INSERT INTO T2 PARTITION (country, state) SELECT * FROM T1; SELECT * FROM t2; -- 修改数据 INSERT INTO

Spark常用算子解析及代码实战

回眸只為那壹抹淺笑 提交于 2020-05-06 02:06:00
Spark 一.coalesce   1.简介     coalesce常用来合并分区,第二个参数是合并分区时是否产生shuffle。true为产生shuffle,false为不产生shuffle。默认是false不产生shuffle。如果coalesce设置的分区数比原来的分区数还大的话若设置为false则不起作用。如果设置为true则效果等价于repartition。即repartition(numPartitions) = coalesce(numPartitions)。   2.测试数据     val array = Array("spark,scala,6", "hadoop,java,12", "tensorflow,python,8", "solr,java,16", "hbase,java,11")   3.代码                   /**     * coalesce算子,常用于减少分区      */     val befParNum = rdd.getNumPartitions     rdd = rdd.coalesce(1, false) // true为产生shuffle     val coalParNum = rdd.getNumPartitions     /**      * repartition与之类型,一般增大分区数  

spark教程(八)-SparkSession

爷,独闯天下 提交于 2020-05-06 01:27:50
spark 有三大引擎,spark core、sparkSQL、sparkStreaming, spark core 的关键抽象是 SparkContext、RDD; SparkSQL 的关键抽象是 SparkSession、DataFrame; sparkStreaming 的关键抽象是 StreamingContext、DStream SparkSession 是 spark2.0 引入的概念,主要用在 sparkSQL 中,当然也可以用在其他场合,他可以代替 SparkContext; SparkSession 其实是封装了 SQLContext 和 HiveContext SQLContext 它是 sparkSQL 的入口点,sparkSQL 的应用必须创建一个 SQLContext 或者 HiveContext 的类实例 from pyspark import SparkContext, SparkConf from pyspark.sql import SparkSession, SQLContext, HiveContext conf = SparkConf().setAppName( ' test ' ).setMaster( ' yarn ' ) sc = SparkContext(conf= conf) sqlc = SQLContext(sc) print

关于hive当中获取时间的操作。

五迷三道 提交于 2020-05-06 01:17:26
今天突然在网上看到别人的面试题,觉得有点好奇想做一下,突然发现sql server的语法对于hive是不适用的。于是各种查资料。 然后发现hive中没有直接获取到当前时间的函数,而且对于时间定义的函数特别少,问题解决起来还是有难度。 下面介绍hive获取时间的方式: 题目 : 给定一张表(列有月份,销售额),要求查询出月份、本月销售额、上月销售额这三个结果,如果当月上个月的销售额不存在就显示为“*”。 看到这个我第一个想到的就是根据时间来进行分组然后累加求和,然后对分组累加的数据按照月份进行排序,取出前两条数据,然后结束。 看起来思路是对的,可是实际推敲有很多的问题。 (1)比如给定的时间是带日期的并不是按照月份来分的。比如 2018-08-12 像这种的额么分组。还是要将日期进行截取,然后分组累加才行。 (2)题目是获取到当前月份和上个月的数据。万一表中没有存当前的月份,上个月的也没有存怎么办。获取的数据不就不准确了。 针对上面的问题我们肯定要对日期进行截取,然后分组累加,这是毋庸置疑的。另外就是要限定死当前月份和上个月的额月份。然后用限定死的月份去和表中的数据进行join操作 然后问题来了:在写hql的时候发现各种问题,hive获取时间的操作都很少。 SELECT FROM_UNIXTIME(UNIX_TIMESTAMP()); hive是通过获取到时间戳的形式来获取到时间

Hive 学习(六) Hive之常用内置函数一

岁酱吖の 提交于 2020-05-06 01:15:53
一,引言 二,类型转换函数 三,数学运算函数    3.1 四舍五入(round())    3.2 向上取整(ceil())    3.3 向下取整(floor())    3.4 取绝对值(abs())    3.5 求单行数据最小值(least())    3.6 求单行数据最大值(greatest()) 四,字符串函数    4.1 字符串截取(substr)    4.2 字符串拼接(concat和concat_ws)    4.3 字符串长度(length)    4.4 字符串分割(split)    4.5 大小写转换(upper|lower) 五,时间函数    5.1 时间获取(current_timestamp)    5.2 日期获取(current_date)    5.3 时间戳获取(unix_timestamp)    5.4 时间转换 正文 一,引言   在查询数据的时候,往往需要我们对数据进行清洗和处理,而HSQL提供了很多函数方便我们使用,其实很多函数和普通的SQL是一样的,接下来我们对常用的函数进行分析。 二,类型转换函数   语法结构: cast (源数据 as 目标数据类型) -- >注意数据类型必须可以进行相互转换,类似于java的强转   示例: -- >字符串转换成整型 hive > select cast ( ' 1 ' as