Hive insert into directory 命令输出的文件没有列分隔符分析和解决

参考资料:http://stackoverflow.com/questions/16459790/hive-insert-overwrite-directory-command-output-is-not-separated-by-a-delimiter

问题描述:

Hive insert into directory 命令输出的文件没有指定列分隔符,输出结果就像变成了一个字符串。

通过CREATE EXTERNAL TABLE 和load 方式,尝试了多种分隔符都不能正确的区分,所有的字段内容合起来变成一个字符串放在了第一个字段,而后面的字段全部为NULL。

问题分析:

1. 导出前的Hive表是以‘\t‘作为分隔符的,用hadoop fs -cat 看到数据是有分隔符的,如:

001 000
001 000
002 001
003 002
004 003
005 004
006 005
007 006
008 007
099 007

2. 导出语句如下:

insert overwrite directory ‘/tmp/hdfs_out‘ select a.* from invites a where a.ds=‘<date>‘;

3. 查看导出的文件内容:

hadoop dfs -cat /tmp/hdfs_out/000000_0

001000
001000
002001
003002
004003
005004
006005
007006
008007
099007

解决方法:

引文中的满意答案如下:

Are you sure there is no delimiter in the output directory? By default, Hive uses ‘\1‘ for the field delimiter, so you should try
`hadoop dfs -cat "/tmp/hdfs_out/*" | tr ‘\001‘ ‘ ‘ –  libjack May 9 ‘13 at 17:11

意思是,在没有指定分隔符的默认情况下,hive用‘\1‘ 来做列分隔符,因此,对于这样的文件,要用‘\001‘来区分。

据此,将建表语句改为后装载成功:

CREATE EXTERNAL TABLE tmp_06_table_name(
……
)
COMMENT ‘this is tmp_06_table_name‘
ROW FORMAT DELIMITED
  FIELDS TERMINATED BY ‘\1‘
STORED AS INPUTFORMAT
  ‘org.apache.hadoop.mapred.TextInputFormat‘
OUTPUTFORMAT
  ‘org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat‘
LOCATION
  ‘hdfs://yncm/tmp/hdfs_out/‘;
时间: 2024-10-24 20:44:03

Hive insert into directory 命令输出的文件没有列分隔符分析和解决的相关文章

ls命令输出的文件颜色

ls的输出颜色不止3种,有以下几种,白色:表示普通文件蓝色:表示目录绿色:表示可执行文件红色:表示压缩文件浅蓝色:链接文件红色闪烁:表示链接的文件有问题 黄色:表示设备文件 灰色:表示其他文件 这是linux系统约定的默认颜色,你也可以根据自己喜好自己修改 在环境变量$LS_COLORS上修改就行,想永久保存就在-/.bashrc里改 默认的是:echo $LS_COLORSrs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40

Hive常用的SQL命令操作

Hive提供了很多的函数,可以在命令行下show functions罗列所有的函数,你会发现这些函数名与mysql的很相近,绝大多数相同的,可通过describe function functionName 查看函数使用方法. hive支持的数据类型很简单就INT(4 byte integer),BIGINT(8 byte integer),FLOAT(single precision),DOUBLE(double precision),BOOLEAN,STRING等原子类型,连日期时间类型也不

Hive:常用的一些命令

1.一般可以通过beeline,代理方式登录hive; 2.使用数据库abc_hive_db:use abc_hive_db; 3.查看数据库中有哪些表:show tables :有哪些特定表 show tables like '*tb_site*'; 4.查看某张表的表结构:desc tablename; 5.创建表: --OID,MSISDN,StartTime,EndTime,AP_MAC,ApAliasName,HotSpotName,Longitude,Latitude,Floor 0

hive INSERT OVERWRITE table could not be cleaned up.

create table maats.account_channel ROW FORMAT DELIMITED FIELDS TERMINATED BY '^' STORED AS TEXTFILE as select distinct a.account,b.channel from maats.register a join maats.install b on a.device = b.device; INSERT OVERWRITE table maats.account_channel

Linux命令大全----常用文件操作命令

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文主要讲了Linux命令大全----常用文件操作命令,并附有实例 ls 这个命令是经常用到的,用来显示当前目录下有哪些文件 ,ls最常用的参数有三个: -a -l -F.ls -a说明:Linux上的文件以"."开头的文件被系统视为隐藏文件,仅用ls命令是看不到他们的,而用ls -a除了显示 一般文件名外,连隐藏文件也会显示出来. ls -l(这个参数是字母L的小写,不是数

IOS 命令生成ipa文件

#!/bin/bash #-------------------------------------------- # 功能:编译xcode项目并打ipa包 # 使用说明: # 编译project # ipa-build <project directory> [-c <project configuration>] [-o <ipa output directory>] [-t <target name>] [-n] # 编译workspace # ipa

简介make命令和makefile文件

一.为什么要用到 make 命令和 makefile 文件 在 Linux 下编写一个程序,每次编译都需要在命令行一行一行的敲命令.如果是一个很小的程序还好说,命令不怎的复杂,编译速度也挺快,但是对于大型程序来说,这样无疑很麻烦,且不说可能会敲错命令,有时候仅仅改动了一个小地方,却需要将整个程序全部重新编译一遍,显然很浪费时间.Linux 提供了 make 命令来解决上述问题,它会在必要时重新编译所有受改动影响的源文件.同时,还提供了一个 makefile 文件,它告诉 make 命令如何构建应

Linux常用命令(第二版) --文件搜索命令

文件搜索命令 1.which /usr/bin/which #显示系统命令所在目录,绝对目录,不能查找文件 格式:which [系统命令] e.g. which ls 附-whereis:也可以查找到命令的绝对路径 与whereis不同,which会列出这个命令的别名记录,而whereis会显示出这个命令的帮助文档所在位置 2.find /usr/bin/find #查找文件或目录,任何文件皆可,如图片,压缩包等 语法:find [搜索路径] [搜索选项] filename a) find /e

Linux 如何通过命令查看一个文件的某几行(中间几行或最后几行)

linux 如何显示一个文件的某几行(中间几行) [一]从第3000行开始,显示1000行.即显示3000~3999行 cat filename | tail -n +3000 | head -n 1000 [二]显示1000行到3000行 cat filename | head -n 3000 | tail -n +1000 *注意两种方法的顺序 分解: tail -n 1000:显示最后1000行 tail -n +1000:从1000行开始显示,显示1000行以后的 head -n 100