当前位置: 首页 > 知识库问答 >
问题:

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

澹台承
2023-03-14

我从一个临时表中获取数据。我从临时表中选择所有列数据并插入到一个基表中。插入到基表文件后,如下所示。

val1^aval2^aval3^a\n^aval4^a\n:但是我需要这样的数据。

val1 val2 val3   val4  

^A必须从文件中删除,\N应该用空格替换。我想在蜂巢里实现这一点,任何帮助都值得感谢。

共有3个答案

严高峻
2023-03-14

对于\nN

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

对于^A

replace(column_name, "\\^A", "")
狄天逸
2023-03-14

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

regexp_replace(<your column>,'\\^A',' ')
佘茂才
2023-03-14

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

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

因此,如果您不希望\N出现在输出数据文件中,可以使用hive中的COALESCE函数为这些数据类型设置默认值。COALESCE函数如果不为空则返回值,如果为空则返回指定的默认值。

方法1:创建一个带有字段分隔符“\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:

从您的解释来看,您似乎正在尝试读取此输出文件,我假设您正在通过map减少代码读取它。

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

在处理每一行/字段时,您可以检查“\N”字符串的出现并将其替换为任何默认值。

 类似资料:
  • 我有一个配置单元表,其中一个date列上存在分区,但date列以YYYYMMDD格式存储为INT。该表还可以包含未来日期分区的数据。 现在,作为过程的一部分,我希望删除那些在处理日(位于处理日)上运行的分区。 当我编写drop分区时,比如,那么它工作正常。 考虑到我的输入将是唯一的日期格式YYYY-MM-DD和我已经删除所有分区已给出输入日期-1;如何使上述陈述奏效?

  • 我试过这个 如果存在分区(process_date='__hive_default_partition__'),则更改表Table_Name DROP; 我正在犯错误

  • 我正在使用gradle构建一个Spring Boot应用程序,我希望从war中删除文件,因为该文件将从外部加载(它运行在tomcat容器中,而不是嵌入式的)。 我查看了StackOverflow和Gradle文档,试图找出该做什么,但我不知道该绑定到哪个阶段,以及在创建war之前还是之后排除该文件。处理文件似乎也有多种方法。 我相信Maven使用作为等价物。

  • 问题内容: 想象一下,我有以下类似的东西修改 如何在不影响任何子元素的情况下从DOM中仅删除(仅文本)“第一”,“第二”和“第三”。 问题答案: 如果要删除所有子文本节点,则可以使用,然后将匹配集减少为仅文本节点: 注意 :这将保留子元素上所有现有的事件处理程序,使用答案不会做(因为从DOM中删除了这些元素并重新添加了这些元素)。 注2 :一些链接的问题中的答案显示的代码与我的答案中的代码相似,但

  • 到目前为止,我已经尝试了以下命令: 但每当我尝试使用以下命令查找MySQL时,我都会得到一个与MySQL相关的文件列表: 输出: 我现在该怎么办? 我试图找出是否有任何方法可以删除所有与MySQL相关的文件,然后重新安装MySQL。 我需要它来连接Qt。

  • 我使用Hive1.2.1和TEZ0.7进行测试,但是当我使用acid表进行更新和删除时,出现了一些问题,下面是表的结构:

  • 问题内容: 我陷入了XML和Python的困境。任务很简单,但到目前为止我还无法解决,花了那么长时间。我是来这里咨询如何用几行解决它的。 感谢您对遍历树的任何帮助。我总是以太多或太少的元素结束。元素可以无限制地嵌套。给出的例子只是一个例子。我会接受任何解决方案,而不是对dom,minidom,sax等等不挑剔。 我有一个与此类似的XML文件: 我需要的是-解析XML并编写一个新文件。新文件应包含给

  • 问题内容: 起初,我使用了网格。创建新版本的GWT后,我想替换CellTable上的Grid。 问题答案: 查看javadoc以获取详细信息。我的示例就像您可以在此处找到的示例(稍稍扩展一下):