我正在开发一个unix脚本,我将处理由列A或列B分区的Hive表。我想找到一个表是分区的列,以便我可以对其进行后续操作那些分区实例。
Hive中是否有任何属性直接返回分区列?
我想我必须做一个show create table
并以某种方式提取分区名称,如果没有其他方法可行的话。
答案 0 :(得分:2)
通过scala / java api,我们可以访问hive元存储并获取分区列名 org.apache.hadoop.hive.metastore.HiveMetaStoreClient
val conf = new Configuration()
conf.set("hive.metastore.uris","thrift://hdppmgt02.domain.com:9083")
val hiveConf = new HiveConf(conf, classOf[HiveConf])
val metastoreClient = new HiveMetaStoreClient(hiveConf)
metastoreClient.getTable(db, tbl).getPartitionKeys.foreach(x=>println("Keys : "+x))
答案 1 :(得分:1)
可能不是最好的,但还有一种方法是使用 describe 命令
创建表格:
create table employee ( id int, name string ) PARTITIONED BY (city string);
命令:
hive -e 'describe formatted employee' | awk '/Partition/ {p=1}; p; /Detailed/ {p=0}'
<强>输出:强>
# Partition Information
# col_name data_type comment
city string
您可以根据需要改进它。
我探索的另一个选项是查询元存储库表以获取表的分区列信息。
答案 2 :(得分:0)
#use python pyhive:
import hive_client
def get_partition_column(table_name):
#hc=hive connection
hc=hive_client.HiveClient()
cur=hc.query("desc "+table_name)
return cur[len(cur)-1][0]
#################
hive_client.py
from pyhive import hive
default_encoding = 'utf-8'
host_name = 'localhost'
port = 10000
database="xxx"
class HiveClient:
def __init__(self):
self.conn = hive.Connection(host=host_name,port=port,username='hive',database=database)
def query(self, sql):
cursor = self.conn.cursor()
#with self.conn.cursor() as cursor:
cursor.execute(sql)
return cursor.fetchall()
def execute(self,sql):
#with self.conn.cursor() as cursor:
cursor = self.conn.cursor()
cursor.execute(sql)
def close(self):`enter code here`
self.conn.close()
答案 3 :(得分:0)
rows = [['a', 'b', 'c'], ['c', 'b', 'a'], ..., ['a', 'c', 'b']]
values = np.array([])
for row in rows:
values = np.append(values, row)