如何使用配置单元

时间:2017-10-10 14:45:17

标签: hadoop hive hiveql

我从登台表中获取数据。我从登台表中选择所有列数据并插入基表。插入基表文件后如下所示。

val1^Aval2^Aval3^A\N^Aval4^A\N 但我需要数据是这样的。

val1 val2 val3   val4  

^必须从文件中删除,\ N应该用空格替换。 我想在蜂巢中实现这一点,任何帮助都是值得欣赏的。

4 个答案:

答案 0 :(得分:1)

hive的输出是使用字段分隔符编写的,默认情况下,hive使用CTRL-A分隔符,即( ^ A )。所以在这里你看到输出文件中有^ A个字符。

默认情况下,在数据文件中写入NULL值,因为在查询数据时,数据文件中的\ N和\ N被解释为NULL。

因此,如果您不想在输出数据文件中使用\ N,则可以使用hive中的COALESCE函数为这些数据类型设置默认值。 COALESCE函数返回值,如果它不为null,如果它为null,则返回指定的默认值。

方法1: 创建一个带字段分隔符'\ t'的基表,即tab。在create table语句中重写属性'serialization.null.format'=''以设置空字符串的默认值而不是\ N.

CREATE TABLE base_table (
column_1 BIGINT,
column_2 STRING
) ROW FORMAT DELIMITED 
FIELDS TERMINATED BY '\t' 
LINES TERMINATED BY '\n' 
STORED AS TEXTFILE
LOCATION '/tmp/base_table'
TBLPROPERTIES('serialization.null.format'='');

然后使用以下查询将数据插入到表中:

INSERT OVERWRITE TABLE base_table
SELECT COALESCE(column_1, 0L), COALESCE(column_2,"")
FROM my_table
[ some WHERE clause here]

您将看到的输出文件将以制表符分隔,并且\ N值将设置为字段类型默认值。

方法2:

第一种方法将是首选方法。在此方法中,使用基表上的insert overwrite目录并将输出写入目录want:

INSERT OVERWRITE LOCAL DIRECTORY '/home/user/my_table_output/'
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY  '\t' ESCAPED BY '"' LINES TERMINATED BY '\n' 
STORED AS TEXTFILE
SELECT COALESCE(column_1, 0L), COALESCE(column_2,"") 
FROM base_table;

在输出目录中,您将看到预期格式的输出。

方法3:

从您的解释来看,您似乎正在尝试阅读此输出文件,我假设您正在通过mapreduce代码阅读它。

您可以使用分隔符'\ u0001'(在编码时使用转义字符,即'\ u0001')来分割输入字符串。

在处理每个行/字段时,您可以检查'\ N'字符串出现并将其替换为任何默认值。

答案 1 :(得分:0)

您可以使用regexp_replace。例如,要替换^ A:

regexp_replace(<your column>,'\\^A',' ')

答案 2 :(得分:0)

对于\ N

replace(column_name, "\\\N", " ")

对于^ A

replace(column_name, "\\^A", "")

答案 3 :(得分:0)

以下作品

CREATE TABLE A
ROW FORMAT DELIMITED
    FIELDS TERMINATED BY '|'
STORED AS TEXTFILE
TBLPROPERTIES ('serialization.null.format' = '')
AS
SELECT * FROM B;