如何使用配置单元从文件中删除 ^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;
我从暂存中获取数据 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;