我试图将 Hive 查询的输出保存在 HDFS 上,但数据已更改。任何想法?
请参阅下面的数据和更改后的数据。删除文件名前的空格:)
[[正确]:i.stack.imgur.com/DLNTT.png
[[搞砸了]:i.stack.imgur.com/7WIO3.png
对于任何反馈,我们都表示感谢。
提前致谢。
看起来您正在将一个数组导入 Hive,这是可用的复杂类型之一。在内部,Hive 使用 ASCII 字符 002 分隔数组中的元素。如果您查阅ascii 表,您可以看到这是不可打印的字符“文本开头”。看起来您的终端确实打印了不可打印的字符,并且通过比较两个图像,您可以看到 002 确实分隔了数组的每个项目。
同样,Hive 将使用 ASCII 001 分隔一行中的每一列,并将使用 ASCII 003 分隔映射键/值和结构字段/值。选择这些值是因为它们不太可能出现在您的数据中。如果要更改此设置,可以在 create table 语句中使用 ROW FORMAT手动指定分隔符。但是要小心,如果您将集合项终止符切换为类似的东西,,
那么您输入中的任何逗号都会看起来像 Hive 的集合终止符。
除非您需要以人类可读的形式存储数据并且确定有一个不会与您的终结符发生冲突的可打印字符,否则我会让它们保持原样。如果您需要读取 HDFS 文件,您始终hadoop fs -cat /exampleWarehouseDir/exampleTable/* | tr '\002' '\t'
可以将数组项显示为用制表符分隔。如果您针对 Hive 表编写 MapReduce 或 Pig 作业,请注意您的分隔符是什么。学习如何从 MapReduce编写和读取Hive 表是我首先了解这些终结器的方式。如果您在 Hive 中进行所有处理,则不必担心终止符是什么(除非它们出现在您的输入数据中)。
现在这可以解释为什么如果您从 HDFS 读取文件内容时会看到 ASCII 002 弹出,但看起来您是从 Hive 命令行界面看到的,它应该知道集合终止符(并因此使用它们分隔数组的元素而不是打印它们)。我最好的猜测是您指定了错误的架构,并且表的列results
是一个字符串,您打算将其设为数组。这可以解释为什么它继续打印 ASCII 002 而不是将它们用作集合终止符。