为了增加代码健壮性,有时候获取数据表分区不能写死固定的时间,或者sysdate(-1)。
因此需要获取表的最新分区,然后取该分区的数据。
1、show partitions table_name;
只能看有啥分区,不能应用;
2、select dt from table_name where dt >= sysdate( - 10) group by dt order by dt desc limit 1;
限制一段时间,先分组group by,再排序order by desc,最后输出limit 1,测试速度略慢于方法3;
3、select max(dt) from app.p_sku_to_age_4cate where dt >= sysdate( - 10)
限制一段时间,取分区最大的,主要缺点是需要扫描全部分区的数据进行比较,但代码简便;
4、python 调shell 再调hive 执行showpartitions。
import subprocess
def get_table_info(last_day, table_name):
cmd = """
hive -e "show partitions """+table_name+"""" | sort -n -r | awk '{print $1}'
"""
info = subprocess.Popen(cmd,stdout=subprocess.PIPE,shell=True)
dtinfo=info.communicate()[0]
dtlist=str(dtinfo,encoding = "utf-8").split("\n")
pt=dtlist[0].split("/")
dt=[dt.split("=")[1] for dt in pt if 'dt=' in dt][0]
return dt[:10]
pv_dt = get_table_info(last_day, "table_name")