Hive字段分隔符作为固定偏移量

时间:2013-03-04 18:45:29

标签: hadoop hive

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

非常感谢!

2 个答案:

答案 0 :(得分:3)

我用这种方式解决了类似的问题:

给定换行符分隔行,固定偏移列,

首先将数据输入到一列的表中,即字符串

然后通过流hadoop传递Java类或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)

您的配置单元脚本如下所示:

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;

答案 1 :(得分:3)

您还可以避免使用流式传输和python以及所有这些方法,但是使用hive 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;