我有一组日志文件,创建了一个Hive表,现在我想根据一个我不理解的字符对表进行分区&还没有看到的例子是如何为分区指定列如何指定col / field 防爆。这是日志中的行
2012-04-11 16:49:10,629~ [http-7001-11] ~DE1F6F6667913022AE2620D1228817D6~END~ / admin / bp / setup / newedit / ok~pt~219~
表格结构是 CREATE TABLE日志(开始时间STRING,线程STRING,会话STRING,方法STRING,targeturl STRING,注册表字符串,ipaddress STRING,详细信息STRING)行格式删除字段由'〜'终止; 现在,如果我想要6个col,即'注册表'作为日志的分区,我将如何编写分区语句。 一般情况下,如果我有一行(行)cols c1,c2,..... c10 如何在分区中指定col ci? 感谢
答案 0 :(得分:0)
首先要做的是在创建表时明确告诉您希望哪些列成为分区。要使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
您可以阅读有关动态分区on the official Apache wiki
的更多信息答案 1 :(得分:0)
此外,hive遇到了分区外部表的问题。假设您在表单的子目录中设置数据(例如,dt = 21012-04-01和其他类似目录)后创建表,将其声明为外部表。除了您的数据不会在选择中显示外,所有内容都显示正常。
弹性贴图缩小添加了一个解决此问题的功能
ALTER TABLE log RECOVER PARTITIONS;
我正在添加此信息,因为我花了一段时间才找出为什么我的数据不存在。