日期
E'+
时间戳
之间间
隔天数
计算
.11=='7,开始时间戳,结
束时间戳+
.B.'7='结束时间戳)
开始时间戳7'K+.2++ * 86400
变量= spark.sql("""
SELECT YEAR(CURRENT_DATE),
MONTH(CURRENT_DATE), DAY(CURRENT_DATE)""")
分区操
作
一、查看 是否支持分区
/、RS 以及之前版本
$EH"& &(TMM6T(
3、RU
$E&!A6
二、分区表的分类与限制
/、分区表分类
29 分区:基于属于一个给定连续区间的列
值,把多行分配给分区。
1 分区:类似于按 29 分区,区别在于 1
分区是基于列值匹配一个离散值集合中的某个值
来进行选择。
>> 分区:基于用户定义的表达式的返回值来
进行选择的分区,该表达式使用将要插入到表中
的这些行的列值进行计算。这个函数可以包含
中有效的、产生非负整数值的任何表达
式。
87 分区:类似于按 >> 分区,区别在于 87
分区只支持计算一列或多列,且 服务器
提供其自身的哈希函数。必须有一列或多列包含
整数值。
复合分区:在 RS 版本中,只支持 29
和 1 的子分区,且子分区的类型只能为 >>
和 87。
3、分区表限制
/)分区键必须包含在表的所有主键、唯一键
中。
3)7 只能在使用分区函数的列本身进行比
较时才能过滤分区,而不能根据表达式的值去过
滤分区,即使这个表达式就是分区函数也不行。
4)最大分区数: 不使用 2 存储引擎的给定表
的最大可能分区数为 @/V3(包括子分区)。如
果当分区数很大,但是未达到 @/V3 时提示 9
…W A6A6P!W !#
E$666AX&,可以通过增加 6%X& %&
系统变量的值来解决问题,当然同时打开文件的
数量也可能由操作系统限制。
K)不支持查询缓存: 分区表不支持查询缓存,
对于涉及分区表的查询,它自动禁用。 查询缓
存无法启用此类查询。
R)分区的 66" 表不支持外键。
S)服务器 % 影响分区表的同步复制。
主机和从机上的不同 % 可能会导致 F&
语句这可能导致分区之间的数据分配给定主从
位置不同,甚至可能导致插入主机上成功的分区
的分区中常用的是按时间分区,如
下例只要添加到 #"& 语句末尾就可以
实现 3Q/4 年全年一天一个分区了(为了省
事,可以一次分 R)/Q 年):
112729%2'
#%J2(3Q/4)Q/)Q/(2
(3Q/4)/3)4/(
.>12C(/(7,229
+
另外一个常用(但是不容易掌握)的是按字
符串取值分区。在上述按时间分区中我们可
以看到 29%2 关键字。按值分区采用
.%2 关键字,如下例所示:
1127.%2'
'.J>2'%X&-((+>2'/+'Q+
2+-/,
'.J>2'%X&-((+>2'3+'Q+
2+-3,
'.J>2'%X&-(.(+>2'4+'Q+
2+-4,
2.0282J2+
更进一步,其中如下面的语法元素:
%X&-((
可以修改为类似于这样的形式:
0'%X&,/,/+12'((,(=(,(9(+
在现实中,因为访问数据从全表扫描变成了
分区扫描的原因,某些步骤可以达成 /Q)/QQ
倍的性能提升。对于复杂的耗时较长的大作
业,也总是能够缩短一半以上的运行时间。
/数据分区
在分布式程序中,通信的代价较大,通过对数据集在
节点间的分区进行控制以获得较少的网络传输从而提
升整体性能。如果给定的 只需要被扫描一次,
则完全没有必要对其预先进行处理。只有当数据集多
次在诸如连接这种基于键的操作中使用时,分区才会
有帮助。
尽管 无法显示控制每个键具体落在哪一个工作
节点,但 可以确保同一组的键出现在同一个节
点上。
以 I6 操作为例,如果未根据 中的键重新分,
那么在默认情况下,连接操作会将两个数据集中的所
有键的哈希值求出来,将哈希值相同的记录通过网络
传输到同一台机器上,然后在那台机器上对所有键相
同的记录进行连接操作。
3MM6'+算子
W .6Y,.6W
W%%6%%--(%%6%%(P
#6W-
.6W'+ 'G&#&G+ 2'GE%#!
6G+
#-.6Y'#6W-#6W+
%- #&&&O''((,/+,'("(,/Q+,'(#(,K+,'((,U+,
'((,V+,'(W(,/Q++
%/-%MM6'3,MM6=!6#-&"
YP'Y+T3+ '+
6'%/A&'+#&&#'++
结果如下:
rdd_1 [[('b', 10), ('d',
7), ('f', 10)], [('a',
1), ('c', 4), ('e',
9)]]
Z6'+只能用于 ,将 中的 传
入到 MM6=!6# 函数中。还需要注意的是,如果不
将 M6()操作的结果持久化,那么后面每次
用到这个 时都会重复地对数据进行分区操作,
那样的话,MM6'+重新分区带来的好处将会被
抵消。通过这个算子可以完成 $6 中的自定义分
区,则不要向 #& 语言中那样麻烦( 本身提供
了 > $MM6 和 6AMM6)。
4影响分区方式的操作
以下算子会为生成的结果 设好分区方式:
#A!'+、A!J$'+、[6'+、&\!I6()、
A$!I6'+、A!8'+、!#8'+、#"
68'+、MM6'+、 '+、C&! '如果父
有分区方式),]C&! '如果父 有分
区方式),X&'如果父 有分区方式)。
写入分区
变量= spark.sql("""
<查询语句>
""")
变量.write.parquet(
path='<存储路径>/<表
名>/{par_col}={par_val}'.format(par_col='<