SQL系列(三)SQL使用的旁枝末节

首先,来揭晓上期的答案。方法不唯一,符合结果即可~

-- 常规方法
with temp as (select 2 as st,5 as enunion allselect 11 as st,9 as en)selectst,en,collect_list(numbers_end) as result -- 得到等差数组
from(selectst,en,if(st<en,int(numbers+rn),int(numbers-rn)) as numbers_end -- 构造等差数值from(selectst,en,numbers,row_number() over(partition by st order by st) -1 as rn -- 构造排序字段辅助计算from(-- 构造起始差长度+1的重复序列selectst,en,regexp_extract(repeat(concat(st,','),int(abs(en-st)+1)),'(.*),',1) as number_repeat_listfromtemp)a lateral view explode(split(number_repeat_list,',')) t as numbers -- 将重复序列展开成多行)a)a
group byst,en
-- 简易方法
with temp as (select 2 as st,5 as enunion allselect 11 as st,9 as en)selectif(st<en,st+pos,st-pos) as id
fromtemp
lateral view posexplode(split(space(abs(st-en)), '')) t as pos, val

虽然日常中使用最多的是查询,但在数字基建中,增删改也是必不可少的。

Hive的DDL

创建表

-- 创建表模版
use temp;
CREATE TABLE hh_teachr_price(teacherid string comment "教师ID",task_type string comment "任务类型",price string comment "基础单价")
PARTITIONED BY (`dt` string) -- 含分区
ROW FORMAT SERDE
'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
WITH SERDEPROPERTIES (
'field.delim'='\t', -- 字段分隔符
'serialization.format'='\t')
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
;

增删改"插"

-- 新增字段 -- 含分区的表需加上关键字CASCADE,联级改变历史分区文件结构
alter table temp.hh_teachr_price add columns(type string comment '题型', course string comment '科目') CASCADE;-- 删除字段
alter table temp.hh_teachr_price replace columns (teacherid string, task_type string); -- 删除price-- 修改列名
alter table temp.hh_teachr_price CHANGE COLUMN task_type task_type_new string comment '任务特征';
-- 修改注释
alter table temp.hh_teachr_price CHANGE COLUMN task_type task_type string comment '任务特征2';
-- 修改分隔符类型
alter table temp.hh_teachr_price set serdeproperties('field.delim'=',', 'serialization.format'=',');-- 插入数据
insert overwrite table temp.hh_teachr_price partition (dt='${date}') -- 覆盖写入
select ...insert into table temp.hh_teachr_price partition (dt='${date}') -- 追加写入
select ...

MySQL的DDL

创建表

-- 创建表模版
use temp;
CREATE TABLE `question_nums`(`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主键',`dt` varchar(30) NOT NULL DEFAULT 'total_count' COMMENT '日期',`phase` varchar(30) NOT NULL DEFAULT 'total_count' COMMENT '学段',`nums` int(30) NOT NULL DEFAULT '0' COMMENT '数量',`dbctime` datetime(3) DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',`dbutime` datetime(3) DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间',PRIMARY KEY (`id`),UNIQUE KEY `u_key` (`dt`,`phase`)) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT '题目数量'

增删改

-- 合并为一条语句
alter table question_nums
add column `language` varchar(30) not null default 'total_count' comment '语言' -- 增加维度
,add column `new_nums` int(30) not null default '0' comment '新增数量' -- 增加度量
,drop column `new_nums` -- 删除字段
,modify column `nums` decimal(10,1) not null default '0' COMMENT '数量' -- 只修改字段类型
,change `nums` `nums_new` int(30) not null default '0' COMMENT '数量' -- 修改字段名称和类型,drop index `u_key` -- 删除索引
,add unique key `u_key` (`dt`,`phase`,`language`); -- 增加索引

Hive其他操作

服务器查看hdfs文件

# hdfs dfs 与 hadoop fs 用法相通
hdfs dfs -ls 列出路径下的所有文件和文件夹(统计分区数量)
hdfs dfs -cat 查看文件中的内容
hdfs dfs -text 查看文件中的内容
hdfs dfs -text /app/20190909/* |grep channel_id=14764618 正则查找
hdfs dfs -text /app/20190909/* | head[tail] -n 5 展示前[后]5行
hdfs dfs -du -s -h /app/20190909/ 整体文件大小
hdfs dfs -du -s -h /app/20190909/* 各分区文件大小
hdfs dfs -cat /app/20190909/* | wc -l 查看文件行数

Hive参数设置

-- 参数设置
set hive.new.job.grouping.set.cardinality =256; -- 维度组合数2的n次方
set mapreduce.reduce.memory.mb = 8192; -- reduce大小
set mapreduce.map.memory.mb = 8192; -- map大小
set hive.exec.parallel=true; -- 并发
set hive.strict.checks.large.query = false; -- 非严格限制
set hive.mapred.mode = nonstrict; -- 非严格限制
set hive.cli.print.header=true; -- 显示列名
set hive.resultset.use.unique.column.names=false; -- 不显示库表前缀

这里重点说一下严格模式和非严格模式:Hive在严格模式下查询时,需指定分区(查询分区表时),排序后需增加limit限制,不支持笛卡尔积查询。防止误操作等造成的资源浪费。

  • 在严格模式下需指定分区,避免全盘扫面带来的浪费

    分区简单理解就是文件夹,例如按照日期建立多个文件夹,每个日期的数据存在相应的文件夹下。此时的分区字段就是日期。例如:

select*
fromtemp1
wheredt = current_date(dt, -1) -- 指定分区为昨日
  • 在严格模式下需限制排序数量,避免全局排序造成的浪费

    如果排序完后要获取所有数据,可以将limit设置很大,例如:

    select*
    fromtemp1
    wheredt = current_date(dt, -1) -- 指定分区为昨日
    order byage
    limit 100000000 -- 增加limit限制
    
  • 在严格模式下不支持笛卡尔积,主要防止分析师的不当操作,造成资源大量浪费

    可以增加关联字段代替笛卡尔积查询方式,如果还会报错,可以设置参数开启非严格模式,例如:

    -- 开启非严格模式 -- 理论上不开启下述代码也能正常运行
    set hive.strict.checks.large.query = false;
    set hive.mapred.mode = nonstrict;selectcol1,col2
    from(select1 as connect,col1fromtamp1)t1
    left join(select1 as connect,col2fromtamp1)t2 on t1.connect=t2.connect -- 1关联1形成笛卡尔积
    

客户端交互命令

# -e 执行sql语句
hive -e "select * from temp.hh_teachr_price limit 100;"
# -f 执行sql脚本
hive -f /app/mydata/hh_teachr_price.sql# 服务器cli上输出文件
hive -e"set hive.cli.print.header=true; -- 显示列名
set hive.resultset.use.unique.column.names=false; -- 不显示库表前缀select * from temp.hh_teachr_price limit 100;" | sed 's/[\t]/,/g' >hh_teachr_price.csv# hive集群输出文件 无法带标题
set hive.cli.print.header=true; -- 显示列名
set hive.resultset.use.unique.column.names=false; -- 不显示库表前缀insert overwrite local directory '/home/data/hh_teachr_price'
row format delimited fields terminated by ','
select * from temp.hh_teachr_price limit 100;

日常爬坑

  1. 长整型字段与字符串字段关联,两个默认会转为double型,有时会因为超出长度结尾数字变为0造成匹配错误(一对多)。可以将长整型字段转化为字符串再关联。
-- 结尾溢出造成错误匹配上了
selecta.id,b.id
from(select bigint(190000000002778025) as id)a
left join(select '190000000002778023' as id)b on a.id=b.id
  1. 非数值型字符串与数字/数值型字符串比较的区别
select -- 非数值型字符串与数字比较,会造成结果为null'abc' != 2 as a -- null,'' != 2 as c -- null-- 将数字转为数值型字符串即可,'abc' != '2' as b -- true,'' != '2' as d -- true
  1. 字段含有null值,会导致explode丢失数据
-- 因为null造成A类型的数据丢失
selectids,id,dtype
from(select null as ids,'A' as dtypeunion all select'3,4,6' as ids,'B' as dtype)a
lateral view explode(split(ids,',')) t as id
  1. 剔除令人意外的空白符
-- 有些字符串含有类似与空格的空白符,常见的如空格、制表符等;但有些却不常见,如office操作的空白
select regexp_replace(name,'\\s|\\u3000|\\u00A0','a') as name_new -- 查看空白是否替换为a(成功)-- \\s表示常见的空白符
-- \\u3000属于CJK字符的CJK标点符号区块内,是空白字符之一,常出现在中文字符串中
-- \\u00A0主要用在office中,让一个单词在结尾处不会换行显示,常出现在excel导出的文件中

总结

至此,SQL系列已经全部结束,但是需求是无穷的。道阻且长,且行且珍惜~

共勉~

SQL系列(三)SQL使用的旁枝末节相关推荐

  1. SQL Server 2008空间数据应用系列三:SQL Server 2008空间数据类型

    原文:SQL Server 2008空间数据应用系列三:SQL Server 2008空间数据类型 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Server ...

  2. [CentOS Python系列] 三.阿里云MySQL数据库开启配置及SQL语句基础知识

    从2014年开始,作者主要写了三个Python系列文章,分别是基础知识.网络爬虫和数据分析. Python基础知识系列:Pythonj基础知识学习与提升 Python网络爬虫系列:Python爬虫之S ...

  3. 【第21天】SQL进阶-查询优化- performance_schema系列三:事件记录(SQL 小虚竹)

    回城传送–><32天SQL筑基> 文章目录 零.前言 一.练习题目 二.SQL思路 SQL进阶-查询优化- performance_schema系列三:事件记录 等待事件表 even ...

  4. oracle批量更新数据从另一表_常用SQL系列之(五):多表和禁止插入、批量与特殊更新等...

    本系统为@牛旦教育IT课堂在微头条上的内容, 为便于查阅,特辑录于此,都是常用SQL基本用法.. 前两篇连接: (一):SQL点滴(查询篇):数据库基础查询案例实战 (二):SQL点滴(排序篇):数据 ...

  5. db2 日期加减一天_常用SQL系列之(八):列值累计、占比、平均值以及日期运算等...

    本系统为@牛旦教育IT课堂在微头条上发布的内容,为便于查阅,特辑录于此,都是常用SQL基本用法. 前两篇连接: (一):SQL点滴(查询篇):数据库基础查询案例实战 (二):SQL点滴(排序篇):数据 ...

  6. db2 删除schema中所有表_常用SQL系列之(六):删除方式、数据库、表及索引元信息查询等...

    本系统为@牛旦教育IT课堂在微头条上的内容, 为便于查阅,特辑录于此,都是常用SQL基本用法.. 前两篇连接: (一):SQL点滴(查询篇):数据库基础查询案例实战 (二):SQL点滴(排序篇):数据 ...

  7. Red Gate系列之一 SQL Compare 10.4.8.87 Edition 数据库比较工具 完全破解+使用教程

    原文:Red Gate系列之一 SQL Compare 10.4.8.87 Edition 数据库比较工具 完全破解+使用教程 Red Gate系列之一 SQL Compare 10.4.8.87 E ...

  8. mongoose 批量修改字段_常用SQL系列之(五):多表和禁止插入、批量与特殊更新等...

    本系统为@牛旦教育IT课堂在微头条上的内容, 为便于查阅,特辑录于此,都是常用SQL基本用法.. 前两篇连接: (一):SQL点滴(查询篇):数据库基础查询案例实战 (二):SQL点滴(排序篇):数据 ...

  9. greenplum 查询出来的数字加减日期_常用SQL系列之(八):列值累计、占比、平均值以及日期运算等

    本系统为@牛旦教育IT课堂在微头条上发布的内容,为便于查阅,特辑录于此,都是常用SQL基本用法. 前两篇连接: (一):SQL点滴(查询篇):数据库基础查询案例实战 (二):SQL点滴(排序篇):数据 ...

最新文章

  1. 如何获取本地安装的Python模块列表?
  2. mysql avg 求平均值_使用MySQL中的AVG函数求平均值的教程
  3. Mysql数值型字符串按照数值进行排序
  4. 2049 : 压死骆驼的最后一根稻草 (规律)
  5. 在OpenShift上托管的WildFly实例上进行Arquillian测试
  6. 适用于ActiveMQ 5.9的Apache Camel Broker组件
  7. 数据库---mysql的索引和引擎
  8. pos共识机制_OK区块链60讲 | 第17集:什么是PoS共识机制
  9. oracle查询字段嵌套子查询,Oracle通过嵌套子查询连接
  10. 深入理解Solaris内核中互斥锁(mutex)与条件变量(condvar)之协同工作原理
  11. HashMap 的底层源码分析
  12. jquery插件实现分页
  13. 用python写的游戏有哪些_想用Python写个小游戏?这个项目里有21个例子
  14. 空间两条直线的夹角公式(两向量的夹角公式)
  15. SSRF漏洞-Gopher协议扩展利用
  16. 用Python实现中文编程
  17. 母牛生小牛java_Java实现:工厂有一头母牛,一年生一头小母牛,小母牛五年后可以生小牛,问20年工厂有多少头牛?...
  18. iPhone 12易掉漆、边框太锋利还割手?库克快出来对线......
  19. 【DASCTF2023】Misc mp3
  20. Edge浏览器中不输oneTab的标签整理插件

热门文章

  1. cisco 交换机和路由器启动过程
  2. java绕过加密密码_Java实现简单密码加密功能
  3. 二值化-大津法(OTSU)
  4. 维谛技术(Vertiv):场景驱动的边缘计算
  5. 魔兽插件修改服务器名字,《私人定制》如何制作自己心仪的插件
  6. Conmi的正确答案——keil的“Cannot read RTE data from project file: RTE is not enabled”问题
  7. 键盘字母键拆下来如何安装? - T470P/T490
  8. 小科普:说说ANT+和蓝牙4.0的那些事
  9. 循环神经网络教程-第一部分 RNN介绍
  10. 遗传算法求函数最小值(多维)2