hive 中使用with…as语法建立临时中间表

当我们书写一些结构相对复杂的SQL语句时,可能某个子查询在多个层级多个地方存在重复使用的情况,这个时候我们可以使用 with as 语句将其独立出来,极大提高SQL可读性,简化SQL。前mysqloracle、sql server、hive等均支持 with as 用法

hive

1、介绍

with as 也叫做子查询部分,首先定义一个sql片段,该sql片段会被整个sql语句所用到,为了让sql语句的可读性更高些,作为提供数据的部分,也常常用在union等集合操作中。
with as就类似于一个视图或临时表,可以用来存储一部分的sql语句作为别名,不同的是with as 属于一次性的,而且必须要和其他sql一起使用才可以!
其最大的好处就是适当的提高代码可读性,而且如果with子句在后面要多次使用到,这可以大大的简化SQL;更重要的是:一次分析,多次使用,这也是为什么会提供性能的地方,达到了“少读”的目标。

with sub_query_name1 as (
	select 
		xx
	from
		xxx
), -- 注意这里用逗号分割
sub_query_name2 as ( --注意这里没有as,上面一个as跟多个sub_query
	select
		xx
	from
		xx
)
select --正式查询语句,与上面的with as直接没有符号分割
	xx
from
	sub_query_name1,sub_query_name2

2、注意事项

  • 整体作为一条sql查询,即with as语句后不能加分号,不然会报错。
  • with子句必须在引用的select语句之前定义,同级with关键字只能使用一次,多个只能用逗号分割;最后一个with 子句与下面的查询之间不能有逗号,只通过右括号分割,with 子句的查询必须用括号括起来.
  • 如果定义了with子句,但其后没有跟select查询,则会报错!
  • 前面的with子句定义的查询在后面的with子句中可以使用。但是一个with子句内部不能嵌套with子句!

3、代码示例

# 直接查询
with tmp_a as (
select f1,f2,f3 from test1
)
select f1,f2,f3 from tmp_a;
# 多表关联
with tmp_a as (
select f1,f2,f3 from test1
),
tmp_b as(
select f1,f4,f5 from test2
)
select a.f1,a.f2,a.f3,b.f4,b.f5 from
tmp_a a
left join
tmp_b b
on a.f1 = b.f1

numpy 以矩阵为基础的Python 科学计算基础包

NumPy 是 Python 科学计算的基础包。它是一个 Python 库,提供了一个多维数组对象、各种派生对象(例如掩码数组和矩阵),以及用于对数组进行快速操作的各种例程,包括数学、逻辑、形状操作、排序、选择、I/O 、离散傅立叶变换、基本线性代数、基本统计运算、随机模拟等等。

numpy

1、安装

两种安装方式: anaconda 和pip安装

# Best practice, use an environment rather than install in the base env
conda create -n my-env
conda activate my-env
# If you want to install from conda-forge
conda config --env --add channels conda-forge
# The actual install command
conda install numpy
---------------------------------------
pip install numpy

2、简介

N维数组容器。

Numpy专门针对ndarray的操作和运算进行了设计,所以数组的存储效率和输入输出性能远优于Python中的嵌套列表,数组越大,Numpy的优势就越明显。Numpy系统是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list structure)结构要高效的多(该结构也可以用来表示矩阵(matrix))。据说NumPy将Python相当于变成一种免费的更强大的MatLab系统。

数组与列表的区别:数组是一种特殊变量,虽与列表相似,但列表可以存储任意类型的数据,数组只能存储一种类型的数据,同时,数组提供了许多方便统计计算的功能(如平均值mean、标准差std等)。

3、ndarray的优势

  • 内存块风格:这是因为ndarray中的所有元素的类型都是相同的,而Python列表中的元素类型是任意的,所以ndarray在存储元素时内存可以连续,而python原生lis就t只能通过寻址方式找到下一个元素,这虽然也导致了在通用性能方面Numpy的ndarray不及Python原生list,但在科学计算中,Numpy的ndarray就可以省掉很多循环语句,代码使用方面比Python原生list简单的多。
  • ndarray支持并行化运算(向量化运算)
  • Numpy底层使用C语言编写,内部解除了GIL(全局解释器锁),其对数组的操作速度不受Python解释器的限制,效率远高于纯Python代码。

股票指标-布林线(bollinger bands)简单实用的技术指标

布林通道指标(Bollinger bands)简称BOLL指标,是由约翰.布林先生(John Bollinger)在1980年代早期发明的,布林线是根据统计学中的标准差原理设计出来的一种非常实用的技术指标,布林线的目的是提供一个相对限定的上线和下线,根据限定,价格处于上轨线时是高价,处于下轨线时是低价,此限定可以帮助精确地辨认价格模式,并且有助于对价格行为与指数行为进行比较,以做出系统性交易的决定。

Boll的中文名叫做布林线,布林线由三条线构成,中间一条是均线,上下两条线分别构成压力线和支撑线,中间的区域称为布林带。

布林线示例图

布林线是有于价格相关的三条轨道曲线组成,中轨线通常是一个简单移动平均线,即测量中期趋势,又作为割分上轨和下轨的基础,中轨线与上、下轨线线间的区间由波动率决定。一般情况下价格线在由上下轨道组成的带状区间游走,而且随价格的变化而自动调整轨道的位置。上、下轨之间的带宽越大,表示价格波动越大,而上、下轨之间的带宽越小,则表示价格波动越小。

总结

  1. 布林线是提供了一个相对价格高和低的定义;这种相对定义在和价格动向、其他参考值指标动向比较后,可以形成买卖决定
  2. 在动量(momentum)、交易量等类型的指标当中找到合适的参考指标
  3. 因为在计算布林线时已经把波动性(volatility)和趋势(trend)都包括进去了,所以不建议用波动性(volatility)和趋势(trend)指标来确定价格动向
  4. 布林线还可以用来观察图形样式,如双顶、双底等价格样式(Pattern)
  5. 收盘价在布林线之外是一个继续在信号,并不是一个逆转(reversal)的信号
  6. 移动平均值默认指是20,标准差(standard deviation)默认值是2,而这些默认值是可;其他建议的参数,如果移动平均是50,标准差是2.1,如果移动平均是10,标准差是1.9
  7. 布林线是基于简单移动平均值,而标准差是根据简单移动平均值来计算的,所以在逻辑上一致的
  8. 布林带当中标准差的计算没有很大的统计价值,因为采样数据不全,而这些数据很少是正常发布的
  9. 当价格接触到上轨时,不是一个买的信号,当价格接触的下轨时,不是一个卖的信号
  10. 股价在中轨和上轨中间运行,处于多头市场,说明较为强势,同样,股价在下轨和中轨中间运行,处于空头市场,说明较为弱势;
  11. 股价由下向上穿越中轨时,为加仓信号,但可能会受到中轨的压力;
  12. 当股价由上向下中轨时,为减仓信号,同样可能会受到中轨的支撑;
  13. 股价穿越上轨时,卖出信号。同样当股价穿越下轨时,是买入信号;
  14. 当布林线的开口越来越小的时候,说明股价的波动在减小,多空双方力量趋于一致,此时股价将会选择突破方向;
  15. 当布林线的开口越来越大的时候,说明一方的力量在增强,股价在进行突破;
  16. 移动平均线显示了中期的趋势;中轨既然是均线,就有趋势的指示作用,如果向上说明趋势向上,反之向下。