在HDFS上写入会使数据混乱

时间:2013-03-19 19:33:01

标签: hive hdfs

我试图在HDFS上保存Hive查询的输出,但数据已更改。任何的想法?

请参阅下面的数据和更改的数据。删除文件名前的空格:)

[[正确]:i.stack.imgur.com/ DLNTT.png

[[搞砸了]:i.stack.imgur.com/ 7WIO3.png

任何反馈都将不胜感激。

提前致谢。

1 个答案:

答案 0 :(得分:0)

看起来您正在将数组导入Hive,这是可用的complex types之一。在内部,Hive使用ASCII字符002分隔数组中的元素。如果查阅ascii table,则可以看到这是不可打印的字符“文本开头”。看起来您的终端确实打印了不可打印的字符,通过比较这两个图像,您可以看到002确实将数组的每个项目分开。

类似地,Hive将使用ASCII 001将行中的每一列分开,并且它将使用ASCII 003分隔映射键/值和结构字段/值。选择这些值是因为它们不太可能出现在您的数据中。如果要更改此设置,可以手动指定分隔符using ROW FORMAT in you create table statement。但是要小心,如果将集合项终止符切换为,之类的内容,那么输入中的任何逗号都会像Hive的集合终结符一样。

除非您需要以人类可读的形式存储数据,并确保有一个不会与终结器发生碰撞的可打印字符,否则我会将它们保留原样。如果您需要阅读HDFS文件,您始终可以hadoop fs -cat /exampleWarehouseDir/exampleTable/* | tr '\002' '\t'显示使用制表符分隔的数组项。如果您针对Hive表编写MapReduce或Pig作业,请注意您的分隔符是什么。从MapReduce学习如何writeread Hive表是我首先了解这些终结器的方法。如果你在Hive中进行所有处理,你不应该担心终结符是什么(除非它们出现在你的输入数据中)。

现在这可以解释为什么如果你从HDFS读取文件内容时会看到ASCII 002弹出,但看起来你是从Hive命令行界面看到的,应该知道集合终结符(和因此,使用它们来分离数组的元素而不是打印它们。我最好的猜测是你指定了模式错误,表results的列是一个字符串,你打算把它作为一个数组。这可以解释为什么它继续打印ASCII 002而不是将它们用作集合终止符。