整理和总结hive sql
- 格式:docx
- 大小:17.35 KB
- 文档页数:5
Hive SQL中提供了一些数组操作函数,用于对数组进行操作。
以下是一些常用的数组操作函数:
1. array_append(array, element):将元素添加到数组的末尾。
2. array_cat(array1, array2):连接两个数组。
3. array_contains(array, element):检查数组是否包含指定元素。
4. array_distinct(array):返回数组中不重复的元素。
5. array_except(array1, array2):返回在array1中但不在array2中的元素。
6. array_intersect(array1, array2):返回在array1和array2中都存在的元素。
7. array_join(array, delimiter):使用指定的分隔符将数组元素连接成一个字符串。
8. array_max(array):返回数组中的最大值。
9. array_min(array):返回数组中的最小值。
10. array_position(array, element):返回元素在数组中的位置。
11. array_remove(array, element):从数组中移除指定元素。
12. array_sort(array):对数组进行排序。
13. arrays_zip(array1, array2):将两个数组按照相同的索引位置组合成一个新的二维数组。
hivesql面试必会6题经典HiveSQL 面试必会 6 题经典HiveSQL 是大数据领域中非常重要的一个技术和工具。
作为一个 HiveSQL 的开发人员或者应聘者,熟练掌握和掌握一些常见的面试题目是十分重要的。
在本文中,我们将为大家介绍六道常见的 HiveSQL 应聘面试题目。
题目一:如何在 HiveSQL 中按照日期排序?答案:HiveSQL 中,你可以使用 ORDER BY 语句对日期排序。
但是需要注意一点,如果你按照日期字符串排序,HiveSQL 将会按照字符串顺序而不是实际日期顺序排序。
为了确保正确的日期排序,你需要将日期字符串转换为日期对象进行排序。
如下:SELECT * FROM table ORDER BY CAST(date AS DATE) DESC;题目二:如何在 HiveSQL 中取出某一个表的最新 N 行记录?答案:可以使用 HiveSQL 中的 DESC 语句和 LIMIT 关键字按照降序排序并限制行数。
如下:SELECT * FROM table ORDER BY date DESC LIMIT N;题目三:如何使用 HiveSQL 中的 LIKE 语句匹配类似于正则表达式的模式?答案:在 HiveSQL 中,你可以使用 LIKE 语句,并在搜索的字符串中使用 % 和 _ 替代符号来匹配指定的模式。
如下:SELECT * FROM table WHERE field LIKE '%str%';题目四:如何在 HiveSQL 中取出两个日期之间的所有记录?答案:在 HiveSQL 中,你可以使用 BETWEEN 关键字来过滤两个日期之间的记录。
如下:SELECT * FROM table WHERE date BETWEENstart_date AND end_date;题目五:如何在 HiveSQL 中在多个表之间进行 JOIN 操作?答案:在 HiveSQL 中,你可以使用 JOIN 关键字在多个表中进行联接操作。
hive常用的的函数Hive提供了一种简单的SQL查询语言称为HiveQL,它允许数据工程师、数据分析师和应用程序开发人员查询和管理大规模数据。
以下是Hive中常用的一些函数:1. 字符串函数:`length(string)`: 返回字符串的长度。
`concat(string1, string2, ...)`: 连接两个或多个字符串。
`substr(string, start, length)`: 返回字符串的子串。
`trim(string)`: 去除字符串两端的空格。
`ltrim(string)`: 去除字符串左端的空格。
`rtrim(string)`: 去除字符串右端的空格。
2. 数值函数:`abs(bigint)`: 返回整数的绝对值。
`ceil(double)`: 返回大于或等于给定数字的最小整数。
`floor(double)`: 返回小于或等于给定数字的最大整数。
`round(double, ndigits)`: 返回四舍五入的值,其中ndigits是精度。
`mod(int, int)`: 返回第一个参数除以第二个参数的余数。
3. 日期函数:`current_date()`: 返回当前日期。
`from_unixtime(unix_timestamp[, format])`: 将UNIX时间戳转换为指定格式的日期时间。
`unix_timestamp()`: 将当前日期和时间转换为UNIX时间戳(以秒为单位)。
`date_format(date, format)` or `date_format(timestamp, format)`: 将日期/时间值格式化为指定的字符串格式。
4. 聚合函数:`count(), count(column)`: 计算行数或非NULL值的数量。
`sum(column)`: 计算列的总和。
`avg(column)`: 计算列的平均值。
`min(column)`: 返回列中的最小值。
hive sql exists用法在HiveSQL中,exists用于检查子查询是否返回任何行。
当子查询返回一个或多个行时,exists返回true,否则返回false。
exists语句通常与where子句一起使用,以便过滤特定条件下的数据。
exists语句的语法如下:```select column_name(s)from table_namewhere exists(select column_name from table_name where condition);```在这个语法中,exists子句包含一个子查询,该子查询可以是任何有效的select语句。
如果子查询返回至少一行,则主查询的结果集将包含所选列的所有行。
如果子查询未返回行,则主查询返回空结果集。
使用exists语句的一个常见用途是在Hive SQL中执行嵌套查询。
例如,以下查询返回一个包含“employees”表中所有部门的列表:```SELECT departmentFROM departmentsWHERE EXISTS(SELECT *FROM employeesWHERE departments.department_id =employees.department_id);```在这个查询中,exists子查询检查“employees”表中是否存在与“departments”表中的部门匹配的记录。
如果存在,则主查询返回包含所有“departments”表中包含的部门的名称的结果集。
如果不存在,则主查询返回空结果集。
总之,exists在Hive SQL中是一个非常有用的操作符,可以用于检查子查询是否返回任何行,以及在需要过滤特定条件下的数据时进行嵌套查询。
hive sql insert语法Hive SQL 的 `INSERT` 语法用于将数据插入到已存在的表中。
以下是`INSERT` 语法的几种常见用法:1. INSERT INTO TABLE将数据插入到表中:```sqlINSERT INTO TABLE tablename VALUES (value1, value2, ...);```2. INSERT INTO TABLE SELECT将查询结果插入到表中:```sqlINSERT INTO TABLE tablename SELECT column1, column2, ... FROM another_table WHERE condition;```3. INSERT OVERWRITE TABLE首先,覆盖表中的数据,然后插入新数据:```sqlINSERT OVERWRITE TABLE tablename VALUES (value1, value2, ...);```或者使用查询来覆盖数据:```sqlINSERT OVERWRITE TABLE tablename SELECT column1, column2, ... FROM another_table WHERE condition;```注意:`OVERWRITE` 操作会删除表中的所有数据,只保留最后插入的数据。
如果你只想插入新数据而不删除现有数据,请使用 `INSERT INTO` 而不是`INSERT OVERWRITE`。
4. INSERT INTO TABLE PARTITION将数据插入到表的特定分区中:```sqlINSERT INTO TABLE tablename PARTITION(partition_column='partition_value') VALUES (value1, value2, ...); ```或者使用查询来插入到分区:```sqlINSERT INTO TABLE tablename PARTITION(partition_column='partition_value') SELECT column1, column2, ... FROM another_table WHERE condition;```5. INSERT INTO TABLE AS SELECT (简写为 `INSERT AS SELECT`)先执行查询,然后将结果插入到表中:```sqlINSERT INTO TABLE tablename AS SELECT column1, column2, ... FROM another_table WHERE condition;```6. INSERT INTO TABLE FROM (Hive 之后支持)使用 `FROM` 子句来指定源表:```sqlINSERT INTO TABLE tablename FROM another_table SELECT column1, column2, ... WHERE condition;```7. INSERT INTO TABLE FROM VALUES (Hive 之后支持)使用 `FROM VALUES` 来直接插入数据:```sqlINSERT INTO TABLE tablename FROM VALUES (value1, value2, ...);```请注意,为了成功执行上述命令,你可能需要确保你的 Hive 表有相应的分区和/或列格式。
hive sql 建表语句Hive是基于Hadoop的数据仓库基础设施,可以通过Hive SQL来进行数据的查询、分析和处理。
以下是符合标题要求的10个Hive SQL建表语句:1. 创建学生表(student):CREATE TABLE student (id INT,name STRING,age INT,gender STRING,grade STRING);2. 创建课程表(course):CREATE TABLE course (id INT,name STRING,credit INT,teacher STRING);3. 创建成绩表(score):CREATE TABLE score (student_id INT,course_id INT,score INT);4. 创建订单表(order):CREATE TABLE order (order_id INT,customer_id INT,order_date DATE,total_amount DOUBLE);5. 创建产品表(product):CREATE TABLE product (product_id INT,name STRING,price DOUBLE,category STRING);6. 创建员工表(employee):CREATE TABLE employee (employee_id INT,name STRING,position STRING,department STRING,hire_date DATE);7. 创建部门表(department):CREATE TABLE department (department_id INT,name STRING,manager_id INT);8. 创建城市表(city):CREATE TABLE city (city_id INT,name STRING,population INT,country STRING);9. 创建销售记录表(sales):CREATE TABLE sales (order_id INT,product_id INT,quantity INT,price DOUBLE,sale_date DATE);10. 创建设备表(device):CREATE TABLE device (device_id INT,name STRING,type STRING,purchase_date DATE,price DOUBLE);以上是10个符合要求的Hive SQL建表语句,通过这些语句可以创建不同类型的表,用于存储各种业务数据。
hive累加函数Hive是一个基于Hadoop的数据仓库基础设施,它提供了一种类似于SQL的查询语言来处理大数据集。
Hive累加函数是Hive查询语言中的一种函数,用于对指定列进行求和操作。
本文将详细介绍Hive累加函数的使用和常见应用场景。
在Hive中,累加函数有两种常用形式:SUM和SUM(DISTINCT)。
SUM 函数用于对给定列的所有行进行求和操作,而SUM(DISTINCT)函数则在计算求和前先进行去重操作,再对不重复的行进行求和。
下面分别介绍这两种累加函数的使用方法。
1.SUM函数:SUM函数用于对指定列的所有行进行求和操作。
其语法如下:SUM(column_name)使用SUM函数的例子如下:SELECT SUM(salary) FROM employees;上述查询语句将对employees表中的salary列进行求和操作。
2.SUM(DISTINCT)函数:SUM(DISTINCT)函数用于在计算求和之前先进行去重操作,再对不重复的行进行求和。
其语法如下:SUM(DISTINCT column_name)使用SUM(DISTINCT)函数的例子如下:SELECT SUM(DISTINCT salary) FROM employees;上述查询语句将对employees表中的salary列进行去重后求和操作。
除了上述基本用法外,Hive累加函数还可以与其他函数、操作符和条件语句一起使用,以满足更复杂的求和需求。
下面列举几种常见的应用场景:1.条件求和:可以使用CASE语句结合SUM函数来实现对指定条件下的行进行求和。
例如,计算employees表中工资大于1000的员工的总工资:SELECT SUM(CASE WHEN salary > 1000 THEN salary ELSE 0 END) FROM employees;2.分组求和:可以通过GROUP BY子句将数据分组后再进行求和操作。
hiveSQL静态分区和动态分区Hive 分区介绍:hive中简单介绍分区表(partition table),含动态分区(dynamic partition)与静态分区(static partition)hive中创建分区表没有什么复杂的分区类型(范围分区、列表分区、hash分区、混合分区等)。
分区列也不是表中的⼀个实际的字段,⽽是⼀个或者多个伪列。
意思是说在表的数据⽂件中实际上并不保存分区列的信息与数据。
分区改变了HIVE 对数据存储的组织⽅式,hive 会创建反应分区结构的⼦⽬录,就是那些实际的⽬录名称。
对数据进⾏分区,最主要的原因就是为了更快的查询。
可以通过,show partitions 表名查看表中存在的所有分区,或者describe extended 表名desc 表名动态分区:当需要创建⾮常多的分区的时候,Hive提供了动态分区的功能:可以基于查询的参数,推断出需要创建分区的名称。
INSERT OVERWRITE TABLE emp PARTITION (country, state) SELECT ..., ... , ty, se.stFROM staged_emp se;需要注意,字段值和分区之间的关系是根据位置⽽不是字段名称来进⾏匹配的。
动态分区也可以和静态分区混合使⽤,但是静态分区必须出现在动态分区之前。
举例:使⽤动态分区要先设置hive.exec.dynamic.partition参数值为true,默认值为false;动态分区的使⽤⽅法很简单,假设我想向stat_date='20110728'这个分区下⾯插⼊数据,⾄于province插⼊到哪个⼦分区下⾯让数据库⾃⼰来判断,那可以这样写:insert overwrite table partition_test partition(stat_date='20110728',province)select member_id,name,province from partition_test_input where stat_date='20110728';stat_date叫做静态分区列,province叫做动态分区列。
hive中groupby的用法在Hive中,`GROUP BY`用于将数据按照一个或多个列进行分组。
`GROUP BY`用于与聚合函数(如`COUNT`,`SUM`,`AVG`等)一起使用,常用于对数据进行统计和汇总。
下面是`GROUP BY`的基本语法:```SELECT column1, column2, aggregate_function(column3) FROM tableGROUP BY column1, column2;```- `column1, column2`:要按照哪些列进行分组- `aggregate_function(column3)`:对哪些列进行聚合函数的计算以下是一个详细的示例,演示如何在Hive中使用`GROUP BY`:假设我们有一个名为`orders`的表,包含以下列:`order_id, customer_id, order_date, order_total`。
首先,我们可以使用以下语句来计算每个客户的订单总数:```sqlSELECT customer_id, COUNT(order_id) as order_count FROM ordersGROUP BY customer_id;```输出将显示每个客户的ID和他们的订单数量。
我们还可以使用`GROUP BY`来计算每个客户的订单总额:```sqlSELECT customer_id, SUM(order_total) as total_amount FROM ordersGROUP BY customer_id;```这将给出每个客户的ID以及他们的订单总额。
`GROUP BY`还可以用于多个列的组合。
例如,我们可以使用以下语句计算每个客户每年的订单总额:```sqlSELECT customer_id, YEAR(order_date) as order_year,SUM(order_total) as total_amountFROM ordersGROUP BY customer_id, YEAR(order_date);```这将按客户ID和订单年份对数据进行分组,并计算每个组的订单总额。
HiveSQL语句的正确执⾏顺序关于 sql 语句的执⾏顺序⽹上有很多资料,但是⼤多都没进⾏验证,并且很多都有点⼩错误,尤其是对于 select 和 group by 执⾏的先后顺序,有说 select 先执⾏,有说 group by 先执⾏,到底它俩谁先执⾏呢?今天我们通过 explain 来验证下 sql 的执⾏顺序。
在验证之前,先说结论,Hive 中 sql 语句的执⾏顺序如下:from .. where .. join .. on .. select .. group by .. select .. having .. distinct .. order by .. limit .. union/union all可以看到 group by 是在两个 select 之间,我们知道 Hive 是默认开启 map 端的 group by 分组的,所以在 map 端是 select 先执⾏,在 reduce 端是 group by 先执⾏。
下⾯我们通过⼀个 sql 语句分析下:selectsum(b.order_amount) sum_amount,count(erkey) count_userfrom user_info aleft join user_order bon a.idno=b.idnowhere a.idno > '112233'group by a.idnohaving count_user>1limit 10;上⾯这条 sql 语句是可以成功执⾏的,我们看下它在 MR 中的执⾏顺序:Map 阶段:1. 执⾏ from,进⾏表的查找与加载;2. 执⾏ where,注意:sql 语句中 left join 写在 where 之前的,但是实际执⾏先执⾏ where 操作,因为 Hive 会对语句进⾏优化,如果符合谓词下推规则,将进⾏谓词下推;3. 执⾏ left join 操作,按照 key 进⾏表的关联;4. 执⾏输出列的操作,注意: select 后⾯只有两个字段(order_amount,userkey),此时 Hive 是否只输出这两个字段呢,当然不是,因为 group by 的是 idno,如果只输出 select 的两个字段,后⾯ group by 将没有办法对 idno 进⾏分组,所以此时输出的字段有三个:idno,order_amount,userkey;5. 执⾏ map 端的 group by,此时的分组⽅式采⽤的是哈希分组,按照 idno 分组,进⾏order_amount 的 sum 操作和 userkey 的 count 操作,最后按照 idno 进⾏排序(group by 默认会附带排序操作);Reduce 阶段:6. 执⾏ reduce 端的 group by,此时的分组⽅式采⽤的是合并分组,对 map 端发来的数据按照 idno 进⾏分组合并,同时进⾏聚合操作 sum(order_amount)和count(userkey);7. 执⾏ select,此时输出的就只有 select 的两个字段:sum(order_amount) as sum_amount,count(userkey) as count_user;8. 执⾏ having,此时才开始执⾏ group by 后的 having 操作,对 count_user 进⾏过滤,注意:因为上⼀步输出的只有 select 的两个字段了,所以 having 的过滤字段只能是这两个字段;9. 执⾏ limit,限制输出的⾏数为 10。
hivesql中avg用法在HiveSQL中,使用AVG函数可以计算平均值。
AVG函数接受一个表达式作为参数,并返回该表达式的平均值。
要使用AVG函数,首先需要在Hive中创建一个表,并将数据加载到该表中。
然后,可以使用AVG函数来计算特定列的平均值。
下面是一个示例,演示了如何在HiveSQL中使用AVG函数:假设我们有一个名为"students"的表,其中包含学生的姓名和成绩两列。
我们希望计算所有学生的平均成绩。
首先,我们可以创建"students"表并加载数据:CREATE TABLE students (name STRING, score INT);LOAD DATA LOCAL INPATH '/path/to/students.csv' INTO TABLE students;接下来,我们可以使用AVG函数来计算平均成绩:SELECT AVG(score) FROM students;该查询将返回所有学生的平均成绩。
注意,AVG函数只能用于数值列,所以在使用之前需要确保所选择的列包含数值类型的数据。
除了简单的平均值计算外,AVG函数还可以与其他函数和操作符结合使用。
例如,我们可以计算特定条件下的平均值:SELECT AVG(score) FROM students WHERE score > 80;这将返回分数高于80的学生的平均成绩。
总之,HiveSQL中的AVG函数是一个强大的工具,用于计算数据列的平均值。
通过合理使用AVG函数,可以轻松地获取所需的统计信息。
2.Hive常见操作命令整理该笔记主要整理了《Hive编程指南》中⼀些常见的操作命令,⼤致如下(持续补充中):1. 查看/设置/修改变量2. 执⾏命令3. 搜索相关内容4. 查看库表信息5. 创建表6. 分区7. 修改表(重命名、修改列、删除列、增加列)8. 找到表位置并导出⾄本地9. 去空格10. case...when...then句式11. 操作符12. group by...having句式13. JOIN14. order by和sort by15. 抽样查询16. 视图17. 分桶表18. 函数19. with...as20. rank() over (partition by ... order by ... asc/desc)和row_number()21. 时间相关的函数(from_unixtime,unix_timestamp,date_add,months_between)22.substr()23.regexp_replace()和regexp_extract()24.动态分区25.nvl和grouping set26. concat_ws()、group_concat()和collect_list()teral view explode()1. 查看/设置/修改变量$ hive############# 查询环境变量############hive>set env:HOME;# 打印命名空间hivevar, hiveconf, system和env所有变量hive>set;# 还打印Hadoop所定义的所有属性hive>set -v;############# 设置hive变量############hive>set hivevar:foo=bar# 查看刚设置的变量hive>set foo;hive>set hivevar:foo;############# 修改属性变量############# hiveconf: Hive相关的配置属性# 不进⼊Hive进⾏配置属性修改hive --hiveocnf hive.cli.print.current.db=true# 进⼊hive进⾏配置修改hive>set hiveconf:hive.cli.print.current_db=true;2. 执⾏命令# 执⾏命令⽅式1:使⽤下⾯的 “⼀次使⽤”命令(-e是指⼀次执⾏,-S是指静默模式,在输出结果中不显⽰Ok和Time taken字段)hive -e -S "select * from mytable limit 3";# 执⾏命令⽅式2:调⽤Hive执⾏hql⽂件hive -f /path/query.hql# 执⾏命令⽅式3:在Hive shell内执⾏hql⽂件$ hivehive>source /path/query.hql3. 搜索相关内容# 模糊搜索set命令的输出结果中某个于warehouse相关的属性$ hive -S -e "set" | grep warehousehive.metastore.warehouse.dir=/user/hive/warehousehive.warehouse.subdir.inherit.perms=false4. 查看库表信息# 查看数据库,使⽤like是以ahf开头,以其他字符结尾(即.*)的数据库名show databases;show databases like 'ahf.*';# 查看表的详细表结构信息(formatted⽐extended输出内容更详细且可读性更⾼)describe mydb.table;describe formatted mydb.table;describe extended mydb.table;5. 创建表# 拷贝表结构,⽽不拷贝数据(⽤like)create table if not exists mydb.mytable like mydb.mytable2;# 拷贝表结构,且拷贝数据(⽤as)create table if not exists mydb.mytable asselect*from mydb.mytable2;# 直接创建表结构create table if not exists mydb.mytable(id string comment 'id',name string comment '姓名')partitioned by (class string)stored as orc;6. 分区# 建⽴分区create table(字段1 字段类型, 字段2 字段类型)paritioned by (字段名3 字段类型, 字段名4 字段类型);# 查看分区show partitions table_name;# 查看某个特定分区键的分区show partitions table_name partition(⼀个分区字段='该分区字段下的某个值');# 增加分区alter table log_message add partition(year=2012, month=1, day=2);# 删除分区alter table log_messages drop if exists partition(year=2012, month=1, day=2);7. 修改表(重命名、修改列、删除列、增加列)# 表重命名alter table log_messages rename to logmsgs;# 修改列信息, 在下⾯的例⼦中,# 我们将字段hms重命名为hour_minutes_seconds,修改其类型和注释,再转移到severity字段之后# 如果⽤户想将这个字段移动到第⼀个为位置,只需要使⽤first关键字替换after severityalter table log_messages change column hms hour_minutes_seconds intcomment 'the hours, minutes, and seconds parts of the timestamp'after severity;# 删除或替换列, 下⾯的例⼦移除了之前所有字段并重新指定了新的字段alter table log_messages replace columns(新字段1 int comment '...',新字段2 string comment '...');# 增加列alter table log_messages add columns(app_name string comment 'application name',session_id long comment 'the current session id');8. 找到表位置并导出⾄本地# 找到表位置describe formatted mydb.mytable;# 例如:Location:hdfs://alg-hdfs/warehouse/user/alvinai.mydb/mytable# 导出⽂件hadoop fs -cp [表来源][⽬标导出路径]9. 去空格# 去空格 ltrim去左空格,rtrim去右空格ltrim(string s)10. case...when...then句式select name,salary,case when salary <5000.0then'low'when salary >=5000.0and salary <70000.0then'middle'else'high'end as bracketfrom employees;11. 操作符# 常见的谓语操作符A<>B跟A!=B是⼀样的A<==>B是指任⼀为NULL,则结果为NULLA is null还有A is not nulla not betweenb and c, between是闭区间# LiKE和RELIKE谓语操作符A like B, A relike B前者是SQL,后者是JAVA的正则表达式A like B, ‘x%’表⽰A必须以字母x开头,‘%x’表⽰A必须以字母x结尾,‘%x%’表⽰A包含字母x,可以位于开头结尾或者字符串中间A relike B, .号表⽰任意字符,*表⽰重复左边的字符串零次到⽆数次,表达式(x|y)表⽰x或者y匹配例⼦:查找住址以Ave结尾的⼈select name, address from where employees where address like'Ave.';例⼦:查找地址以0开头的⼈select name, address from where employees where address like 'O%';# split操作符select split(row_key, '_')[0] as account_id12. group by...having句式# 如果想要对group by语句产⽣的分组进⾏条件过滤,可以⽤having例如:select year(ymd),avg(price_close) from stockswhere exchange ='NASDAQ'and symbol ='AAPL'group by year(ymd)having avg(price_close) >0.0;13. JOINHive连接有:inner join: 交集,就是join。
HiveSQLpercentile和percentile_approx函数计算千分数1. percentile函数:percentile函数是用于计算给定数据集的千分数(percentile)的一种方式。
该函数会对给定的数据集进行排序,然后根据指定的百分比返回相应的值。
语法如下:```percentile(column_name, percentage)```其中,column_name是要计算千分数的列名,而percentage是一个介于0到1之间的小数,表示要计算的千分数的百分比。
例如,假设我们有一个包含一组数据的表students,其中有一个列成绩(score),我们想要计算该数据集的90%分位数(百分之九十的千分数),可以使用以下查询:```SELECT percentile(score, 0.9) FROM students;```这将返回数据集中成绩列的90%分位数。
2. percentile_approx函数:percentile_approx函数是计算千分数的一种近似方法。
与percentile函数不同,该函数在计算分位数时使用了一种近似算法,使得计算速度更快。
语法如下:```percentile_approx(column_name, percentage, accuracy)```其中,column_name和percentage的含义与percentile函数相同。
而accuracy表示近似算法的准确度,是一个介于0到1之间的小数,数值越小表示近似越精确。
与上面相同的例子,我们可以使用以下查询来计算数据集的90%分位数:```SELECT percentile_approx(score, 0.9, 0.05) FROM students;```这里,我们使用了accuracy参数为0.05,表示相对较高的准确度。
需要注意的是,由于percentile_approx函数使用了一种近似算法,所以计算结果可能会与精确的百分位数存在一些差异。
hive sql 中overwrite用法
在Hive SQL中,`OVERWRITE`关键字用于指定在向表中写入数据时覆盖已经存在的表。
它指示Hive将新写入的数据直接替换掉原有的数据。
使用`OVERWRITE`的语法如下:
```sql
INSERT OVERWRITE TABLE table_name
SELECT ...
FROM ...
WHERE ...
GROUP BY ...
```
在这个语法中,`INSERT OVERWRITE`语句将根据给定的查询结果,将新的数据写入到`table_name`指定的表中。
如果
`table_name`已经存在数据,`OVERWRITE`关键字会覆盖原有的数据。
注意:在Hive中,使用`INSERT OVERWRITE`语句时需要谨慎操作,因为它会删除原有的数据并替换为新的数据。
因此,在使用`OVERWRITE`关键字进行写入操作之前应该先做好相应的备份工作,以防止数据的不可恢复丢失。
进入hive shell#hive或者hive --service cliHive 的启动方式:hive 命令行模式,直接输入/hive/bin/hive的执行程序,或者输入hive –service clihive web界面的启动方式,hive –service hwihive 远程服务(端口号10000) 启动方式,hive --service hiveserverhive 远程后台启动(关闭终端hive服务不退出): nohup hive -–service hiveserver &显示所有函数:hive> show functions;查看函数用法:hive> describe function substr;查看hive为某个查询使用多少个MapReduce作业hive> Explain select a.id from tbname a;--------------------------------------------------------------------------表结构操作:托管表和外部表托管表会将数据移入Hive的warehouse目录;外部表则不会。
经验法则是,如果所有处理都由Hive完成,应该使用托管表;但如果要用Hive和其它工具来处理同一个数据集,则使用外部表。
创建表(通常stored as textfile):hive> create table tbName (id int,name string) stored as textfile;创建表并且按分割符分割行中的字段值(即导入数据的时候被导入数据是以该分割符划分的,否则导入后为null,缺省列为null);hive> create table tbName (id int,name string) row format delimited fields terminated by ','; 创建外部表:hive>create external table extbName(id int, name string);创建表并创建单分区字段ds(分区表指的是在创建表时指定的partition的分区空间。
): hive> create table tbName2 (id int, name string) partitioned by (ds string);创建表并创建双分区字段ds:hive> create table tbname3 (id int, content string) partitioned by (day string, hour string);表添加一列:hive> alter table tbName add columns (new_col int);添加一列并增加列字段注释:hive> alter table tbName add columns (new_col2 int comment 'a comment');更改表名:hive> alter table tbName rename to tbName3;删除表(删除表的元数据,如果是托管表还会删除表的数据):hive>drop table tbName;只删除内容(只删除表的内容,而保留元数据,则删除数据文件):hive>dfs –rmr ‘warehouse/my-table’;删除分区,分区的元数据和数据将被一并删除:hive>alter table tbname2 drop partition (dt='2008-08-08', hour='09');--------------------------------------------------------------------------元数据存储(从HDFS中将数据导入到表中都是瞬时的):将文件中的数据加载到表中(文件要有后缀名,缺省列默认为null):hive> load data local inpath 'myTest.txt' overwrite into table tbName;在已创立的表上添加单分区并指定数据:hive> alter table tbname2 add partition (ds='20120701') location '/user/hadoop/his_trans/record/20120701';在已创立的表上添加双分区并指定数据:hive> alter table tbname2 add partition (ds='2008-08-08', hour='08') location '/path/pv1.txt' partition (dt='2008-08-08', hour='09') location '/path/pv2.txt';加载本地数据,根据给定分区列信息:hive> alter table tbname2 add partition (ds='2013-12-12');hdfs数据加载进分区表中语法(当数据被加载至表中时,不会对数据进行任何转换。
Load操作只是将数据复制至Hive表对应的位置)[不建议使用]:hive> load data local inpath 'part.txt' overwrite into table tbName2 partition(ds='2013-12-12');hive> load data inpath '/user/hadoop/*' into table tbname3 partition(dt='2008-08-08', hour='08');--------------------------------------------------------------------------SQL 操作:查看表结构:hive> describe tbname;hive> desc tbname;显示所有表:hive> show tables;按正条件(正则表达式)显示表:hive> show tables '.*s';查询表数据不会做mapreduce操作:hive> select * from tbName;查询一列数据,会做mapreduce操作:hive> select a.id from tbname a ;基于分区的查询的语句:hive> select tbname2.* from tbname2 a where a.ds='2013-12-12' ;查看分区语句:hive> show partitions tbname2;函数avg/sum/count/group by/order by (desc)/limit:select logdate, count(logdate) as count from access_1 group by logdate order by count limit 5;内连接(inner join):hive> SELECT sales.*, things.* FROM sales JOIN things ON (sales.id = things.id);外连接:hive> SELECT sales.*, things.* FROM sales LEFT OUTER JOIN things ON (sales.id = things.id);hive> SELECT sales.*, things.* FROM sales RIGHT OUTER JOIN things ON (sales.id = things.id);hive> SELECT sales.*, things.* FROM sales FULL OUTER JOIN things ON (sales.id =things.id);in查询:Hive不支持,但可以使用LEFT SEMI JOINhive> SELECT * FROM things LEFT SEMI JOIN sales ON (sales.id = things.id);相当于sql语句:SELECT * FROM things WHERE things.id IN (SELECT id from sales); Map连接:Hive可以把较小的表放入每个Mapper的内存来执行连接操作hive> SELECT /*+ MAPJOIN(things) */ sales.*, things.* FROM sales JOIN things ON (sales.id = things.id);INSERT OVERWRITE TABLE ..SELECT:新表预先存在hive> FROM records2> INSERT OVERWRITE TABLE stations_by_year SELECT year, COUNT(DISTINCT station) GROUP BY year> INSERT OVERWRITE TABLE records_by_year SELECT year, COUNT(1) GROUP BY year> INSERT OVERWRITE TABLE good_records_by_year SELECT year, COUNT(1) WHERE temperature != 9999 AND(quality = 0 OR quality = 1 OR quality = 4 OR quality = 5 OR quality = 9) GROUP BY year;CREATE TABLE ... AS SELECT:新表表预先不存在hive>CREATE TABLE target AS SELECT col1,col2 FROM source;创建视图:hive> CREATE VIEW valid_records AS SELECT * FROM records2 WHERE temperature !=9999;查看视图详细信息:hive> DESCRIBE EXTENDED valid_records;--------------------------------------------------------------------------将查询数据输出至目录hive> insert overwrite directory '/tmp/hdfs_out' select a.* from tbname2 a where a.ds='2013-12-12';将查询结果输出至本地目录hive> insert overwrite local directory '/tmp/local_out' select ds,count(1) from tbname group by ds;hive> insert overwrite table events select a.* from tbname a where a.id < 100;hive> insert overwrite local directory '/tmp/sum' select sum(a.pc) from tbpc a ;将一个表的统计结果插入另一个表中hive> from tbname a insert overwrite table events select a.bar,count(1) where a.foo > 0 group by a.bar;hive> insert overwrite table events select a.bar,count(1) from tbname a where a.foo > 0 group by a.bar;JOIN:hive> from tbname t1 join tbname2 t2 on (t1.id = t2.id) insert overwrite table events select t1.id,,t2,ds;将多表数据插入到同一表中FROM srcINSERT OVERWRITE TABLE dest1 SELECT src.* WHERE src.key < 100INSERT OVERWRITE TABLE dest2 SELECT src.key, src.value WHERE src.key >= 100 and src.key < 200INSERT OVERWRITE TABLE dest3 PARTITION(ds='2008-04-08', hr='12') SELECT src.key WHERE src.key >= 200 and src.key < 300INSERT OVERWRITE LOCAL DIRECTORY '/tmp/dest4.out' SELECT src.value WHERE src.key >= 300;将文件流直接插入文件hive> FROM invites a INSERT OVERWRITE TABLE events SELECT TRANSFORM(a.foo, a.bar) AS (oof, rab) USING '/bin/cat' WHERE a.ds > '2008-08-09';This streams the data in the map phase through the script /bin/cat (like hadoop streaming). Similarly - streaming can be used on the reduceside (please see the Hive Tutorial or examples)--------------------------------------------------------------------------### 错误信息###问题:load数据全部为null原因:数据分隔符的问题,反序列化数据的时候出错了,定义表的时候需要定义数据分隔符。