2013-03-04 45 views
2

任何人都可以告诉:有可能通过固定偏移量创建配置单元表和单独的值。 例如,文件: col1 col2 col3 在这种情况下,表中的第一列为1-4个字符,第二列为5-8个字符,第三个为8-12个字符。Hive字段分隔符作为固定偏移量

非常感谢!

+0

https://groups.google.com/ a/cloudera.org/forum /?fromgroups =#!topic/cdh-user/9xvU0RyqKPA – 2013-03-05 01:32:59

+1

http://stackoverflow.com/questions/1309700/regex-for-fixed-width-field – 2013-03-05 01:34:18

回答

3

我已经解决了类似的问题是这样的:

考虑换行分隔行,固定偏移列输入,

首先将数据输入一列一个表,一个字符串

然后通过任一个Java类或经由流式传输的hadoop一个Python模块,即采用在一行,并返回多个字段:

import sys 

for line in sys.stdin: 
    # line will have a newline on the end you don't want 
    line = line.strip() 
    output = [] 
    output.append(line[:4]) 
    output.append(line[4:8]) 
    output.append(line[8:12]) 
    print '\t'.join(output) 

你的蜂房小号CRIPT看起来就像这样:

CREATE TABLE IF NOT EXISTS input_raw(line STRING); 

LOAD DATA LOCAL INPATH '${hiveconf:input}' OVERWRITE INTO TABLE input_raw; 

CREATE TABLE IF NOT EXISTS processed_data(
field1 STRING, 
field2 STRING 
field3 STRING); 

delete FILE processing.py; 

add FILE processing.py; 

INSERT INTO TABLE processed_data 
SELECT 
TRANSFORM (line) 
USING 'python processing.py' 
AS(field1, field2, field3) 
FROM input_raw; 

DROP TABLE input_raw; 
3

你也可以避免流和python和所有的跟随你的方法,但使用蜂巢SUBSTR()

CREATE TABLE IF NOT EXISTS input_raw(line STRING); 

LOAD DATA LOCAL INPATH '${hiveconf:input}' OVERWRITE INTO TABLE input_raw; 

CREATE TABLE IF NOT EXISTS processed_data(
field1 STRING, 
field2 STRING 
field3 STRING); 

INSERT INTO TABLE processed_data 
SELECT 
substr(line,1,4) as field1, 
substr(line,5,4) as field2, 
substr(line,9,4) as field3 
FROM input_raw; 

DROP TABLE input_raw; 
+0

我希望我已经看过当我还在那个项目中:) – 2017-06-15 05:56:22

相关问题