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

标签 hadoop hive hiveql

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

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/

相关文章:

java - Hadoop中的内存不足错误

hadoop - map 减少概念

mysql - 按 unix 时间戳的 Hive 动态分区

hadoop - HIve配置中发生错误

hadoop - Hive 比 Spark 快吗?

sql - 如何从 Hive 中的 'yyyy-MM' 日期格式获取上个月

hadoop - hive 中的不同列

java - Hadoop 映射器从未被调用,自定义输入格式可能是问题

hadoop - Hive 更新效率(版本 0.14)

hadoop - Hive 解释计划理解