我从暂存表中获取数据。我从暂存表中选择所有列数据并插入到基表中。插入到基表文件后如下所示。
val1^Aval2^Aval3^A\N^Aval4^A\N
但我需要这样的数据。
val1 val2 val3 val4
^A 必须从文件中删除,\N 应替换为空格。 我想在 hive 中实现这一目标,我们将不胜感激。
最佳答案
hive 的输出是使用字段分隔符编写的,默认情况下 hive 使用 CTRL-A 分隔符,即 (^A)。所以在这里您会看到输出文件之间有 ^A 个字符。
默认情况下,NULL 值写入数据文件中,因为在查询数据时,数据文件中的\N 和\N 被解释为 NULL。
因此,如果您不想在输出数据文件中使用\N,则可以使用 COALESCE 为这些数据类型设置默认值。在 hive 中发挥作用。如果 COALESCE 函数不为空,则返回该值;如果为空,则返回指定的默认值。
方法一: 创建一个带有字段分隔符 '\t' 的基表,即制表符。在创建表语句中覆盖属性 '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 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”字符串并将其替换为任何默认值。
关于hadoop - 如何使用配置单元从文件中删除 ^A 和\N,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46669640/