2017-04-17 30 views
0

我有S3中包含.orc文件的多个子目录。我试图创建一个配置单元Metastore,这样我就可以使用Presto/Hive等查询数据。数据结构很差(没有一致的分隔符,难看的字符等)。这里有一个擦洗样本:如何将数据添加到现有的Hive Metastore?

1488736466 199.199.199.199 0_b.www.sphericalcow.com.f9b1.qk-g6m6z24tdr.v4.url.name.com TXT IN: NXDOMAIN/0/143 
1488736466 6.6.5.4 0.3399.186472.4306.6668.638.cb5a.names-things.update.url.name.com TXT IN: NOERROR/3/306 0\009253\009http://az.blargi.ng/%D3%AB%EF%BF%BD%EF%BF%BD/\009 0\009253\009http://casinoroyal.online/\009 0\009253\009http://d2njbfxlilvpsq.cloudfront.net/b_zq_ym_bangvideo/bangvideo0826.apk\009 

我能够创建一个表指向使用SERDE正则表达式中的一个子目录和字段正确解析,但据我可以告诉我可以只加载一个子文件夹一次。

如何向现有的配置单元Metastore添加更多数据?

这里是我的蜂巢metastore创建语句与正则表达式SERDE位的例子:

DROP TABLE IF EXISTS test; 

CREATE EXTERNAL TABLE test (field1 string, field2 string, field3 string, field4 string) 
COMMENT 'fill all the tables with the datas.' 
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe' 
    WITH SERDEPROPERTIES (
"input.regex" = "([0-9]{10}) ([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}) (\\S*) (.*)", 
"output.format.string" = "%1$s %2$s %3$s %4$s" 
) 
STORED AS ORC 
LOCATION 's3://path/to/one/of/10/folders/' 
tblproperties ("orc.compress" = "SNAPPY", "skip.header.line.count"="2"); 

select * from test limit 10; 

我意识到有可能是一个非常简单的解决方案,但我试过INSERT INTO到位创建外部表,但它可以理解地抱怨输入,并且我查看了蜂房和serde文档以获取帮助,但无法找到添加到现有商店的参考。

+1

哇。 (1)你不“加载”任何东西。外部表是包含数据读取和可能写入指令的接口。 (2)Metastore拥有表格的定义,而不是数据。 (3)我严重怀疑你正在使用RegexSerDe查询ORC文件。外部表定义中也没有ORC的指示。 (4)“output.format.string”已过时 –

+0

有两种可能的解决方案。添加文件夹的结构,以便我们看到哪些是相关的。附:添加数据示例 - RegexSerDe有可能在这里过度杀伤。 –

+0

谢谢,@DuduMarkovitz。 1)单词选择不当;我应该更清楚。编辑。 2)参见(1)。 3)原始文件是.orc,但我想我错过了一个'存储为orc'行。现在修复。 4)我不知道 - 谢谢。我将添加一个数据示例。没有分隔符,所以正则表达式是必要的 - 丑陋的数据。你可能会说,但我是Hadoop生态系统的新手,所以我非常感谢帮助。 – TheProletariat

回答

0

使用分区的可能的解决方案。

CREATE EXTERNAL TABLE test (field1 string, field2 string, field3 string, field4 string) 
partitioned by (mypartcol string) 
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe' 
    WITH SERDEPROPERTIES (
"input.regex" = "([0-9]{10}) ([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}) (\\S*) (.*)" 
) 
LOCATION 's3://whatever/as/long/as/it/is/empty' 
tblproperties ("skip.header.line.count"="2"); 

alter table test add partition (mypartcol='folder 1') location 's3://path/to/1st/of/10/folders/'; 
alter table test add partition (mypartcol='folder 2') location 's3://path/to/2nd/of/10/folders/'; 
. 
. 
. 
alter table test add partition (mypartcol='folder 10') location 's3://path/to/10th/of/10/folders/'; 
0

对于@TheProletariat(在OP)

似乎没有必要RegexSerDe由于列由空格(”“)分隔。
注意使用tblproperties ("serialization.last.column.takes.rest"="true")

create external table test 
(
    field1 bigint 
    ,field2 string 
    ,field3 string 
    ,field4 string 
) 
row format delimited 
fields terminated by ' ' 
tblproperties ("serialization.last.column.takes.rest"="true") 
; 
+0

它们实际上并没有被空间分隔。他们是可以采取许多不同格式的DNS记录,其中一些有多个空格,其中一些格式没有,如下所示: TXT IN:NXDOMAIN/0/148 TXT IN:NOERROR/1/124 10090_10203 \ 009sphericalcow。 com \ 009 等 – TheProletariat

相关问题