[英]Apache Hive how to identify which column is the partition
我有一组日志文件,创建了一个Hive表,现在我想基于col对表进行分区,我不了解&尚未看到的示例是如何为分区指定列,如何指定col / field例如 这是日志中的一行
2012-04-11 16:49:10,629〜[http-7001-11]〜DE1F6F6667913013022AE2620D1228817D6〜END〜/ admin / bp / setup / newedit / ok〜pt〜219〜
table struc是CREATE TABLE日志(开始时间STRING,线程STRING,会话STRING,方法STRING,targeturl STRING,注册表字符串,ipaddress STRING,详细信息STRING)。行格式由'〜'终止的限定字段; 现在,如果我想将6the col即“ registry”作为日志的分区,我将如何编写分区语句。 通常,如果我的行(行)带有cols c1,c2,..... c10,如何在分区中指定col ci? 谢谢
您首先要做的是在创建表时明确告诉您希望将哪些列作为分区。 使registry
分区:
CREATE TABLE log(starttime STRING, thread STRING, session STRING, method STRING, targeturl STRING, ipaddress STRING, details STRING)
PARTITIONED BY (registry STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '~'
您可以根据需要添加任意数量的分区,每个分区将是一个嵌套的子文件夹,并且在PARTITIONED BY
声明分区的顺序很重要:第一个将是顶级分区,第二个将是顶级分区降低1级,...例如:
|--- mytable
`---- mypartition1=x
`-------- mypartition2=x
`------- ...
我要做的是:
创建一个指向您的日志目录位置的外部表,根本没有任何分区(仅包含原始日志文件),它将使用所有数据填充该表raw_log
,并且没有分区(尚未):
CREATE EXTERNAL TABLE raw_log(starttime STRING, thread STRING, session STRING, method STRING, targeturl STRING, registry STRING, ipaddress STRING, details STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY '~' LOCATION '/path/to/your/log/dir'
使用Hive的动态分区功能从raw_log
读取并插入log
:
FROM raw_log raw INSERT OVERWRITE TABLE log PARTITION(registry) SELECT raw.starttime, raw.thread, raw.session, raw.method, raw.targeturl, raw.ipaddress, raw.details
您可以在官方Apache Wiki上阅读有关动态分区的更多信息。
此外,hive对于已分区的外部表存在问题。 假设在表格形式的子目录(例如dt = 21012-04-01和其他类似目录)中设置数据之后,创建表声明为外部表。 除了您的数据不会在选择中显示之外,其他所有显示都很好。
弹性地图减少功能添加了解决此问题的功能
ALTER TABLE log RECOVER PARTITIONS;
我添加此信息是因为花了我一段时间才找出为什么我的数据不存在的原因。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.