2017-04-17 77 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

相關問題