如何使用配置单元从文件中删除 ^A 和 \N

How to remove ^A and \N from file using hive

我从暂存中获取数据 table.I 我正在从暂存中选择所有列数据 table 并插入基础 table.After 插入基础 table 文件看起来像下面。

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

val1 val2 val3   val4  

^A 必须从文件中删除,\N 应替换为空格。 我想在蜂巢中实现这一目标,我们将不胜感激。

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

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

对于\N

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

对于^A

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

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

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

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

方法一: 创建一个带有字段分隔符 '\t' 的基础 table 即制表符。覆盖 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'='');

然后使用以下查询将数据插入 table:

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

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

方法二:

第一种方法将是首选方法。在这种方法中,使用基础 table 上的插入覆盖目录并将输出写入目录 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;

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

方法三:

根据您的解释,您似乎正在尝试读取此输出文件,我假设您正在通过 mapreduce 代码读取它。

您可以使用分隔符“\u0001”(在编码时与转义字符一起使用,即“\u0001”)来拆分输入字符串。

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

以下作品

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