我从登台表中获取数据。我从登台表中选择所有列数据并插入基表。插入基表文件后如下所示。
val1^Aval2^Aval3^A\N^Aval4^A\N
但我需要数据是这样的。
val1 val2 val3 val4
^必须从文件中删除,\ N应该用空格替换。 我想在蜂巢中实现这一点,任何帮助都是值得欣赏的。
答案 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;