Hadoop / Hive新手在这里。我正在尝试使用以Hive自定义基于文本的格式存储的数据。我的理解是您可以编写自定义FileFormat
或自定义SerDe
类来执行此操作。是这样的,还是我误解了?什么是关于选择何时选择的一般指导原则?谢谢!
答案 0 :(得分:13)
我明白了。毕竟我没有写一个serde,写了一个自定义的InputFormat(extends org.apache.hadoop.mapred.TextInputFormat
),它返回一个自定义的RecordReader(实现org.apache.hadoop.mapred.RecordReader<K, V>
)。 RecordReader实现了读取和解析我的文件的逻辑,并返回制表符分隔的行。
随后我宣布我的桌子为
create table t2 (
field1 string,
..
fieldNN float)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
STORED AS INPUTFORMAT 'namespace.CustomFileInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat';
这使用原生SerDe。此外,在使用自定义输入格式时需要指定输出格式,因此我选择其中一种内置输出格式。
答案 1 :(得分:7)
基本上你需要了解何时修改SerDe以及何时修改fileformat的区别。
来自官方文件:Hive SerDe
什么是SerDe? 1.SerDe是&#34; Serializer和Deserializer的简称。&#34; 2.Hive使用SerDe(和FileFormat)来读写表行。 3.HDFS文件 - &gt; InputFileFormat - &gt; - &GT;解串器 - &gt;行对象 4.Row对象 - &gt; Serializer - &gt; - &GT; OutputFileFormat - &gt; HDFS文件
所以,第3和第4点显然是在推断出差异。 当您想要以不同于平常的方式读取记录时(记录由&#39; \ n&#39;分隔),您需要具有自定义文件格式(输入/输出)。 当您想要以自定义方式解释读取记录时,您需要自定义SerDe。
让我们举一个常用格式JSON的例子。
场景1: 让我们假设您有一个输入json文件,其中一行包含一个json记录。 因此,现在您只需要自定义Serde以您想要的方式解释读取记录。 不需要自定义输出格式,因为1行将是1条记录。
场景2: 现在,如果您有一个输入文件,其中您的一条json记录跨越多行,并且您希望按原样读取它 你应该首先编写一个自定义输入格式来读入1个json记录,然后这个读取的json记录将转到Custom SerDe。
答案 2 :(得分:2)
取决于您从文本文件中获得的内容。
您可以编写自定义记录阅读器来解析文本日志文件并以您希望的方式返回,输入格式类为您完成该任务。您将使用此jar创建Hive表并加载该表中的数据。
谈到SerDe,我的用法略有不同。我使用InputFormat和SerDe,前者解析实际数据,后者使用我的元数据来稳定表示实际数据。我这样做的原因是什么?我想在hive表中为我的日志文件的每一行创建适当的列(不多或少),我认为SerDe对我来说是完美的解决方案。
最终我将这两个映射为创建最终表,如果我想要或保留这些表,以便我可以进行连接以从那些查询。
我喜欢Cloudera博客的解释。
http://blog.cloudera.com/blog/2012/12/how-to-use-a-serde-in-apache-hive/
答案 3 :(得分:1)
如果你正在使用Hive,请写一个serde。看这些例子: https://github.com/apache/hive/tree/trunk/contrib/src/java/org/apache/hadoop/hive/contrib/serde2
请注意,此接口是特定于Hive的。如果你想将自定义文件格式用于常规的hadoop作业,你必须实现一个单独的接口(我不完全确定哪一个)。
如果您已经知道如何使用其他语言反序列化数据,则可以编写流媒体作业(使用任何语言)并使用现有库。
希望有所帮助