【问题标题】:Hive: Is there any way to customize hiveInputFormat?Hive:有没有办法自定义 hiveInputFormat?
【发布时间】:2014-09-10 08:01:49
【问题描述】:

以下是场景:3 个文件夹位于 hdfs 中。文件如下:

/root/20140901/part-0
/root/20140901/part-1
/root/20140901/part-2
/root/20140902/part-0
/root/20140902/part-1
/root/20140902/part-2
/root/20140903/part-0
/root/20140903/part-1
/root/20140903/part-2

创建hive表后,命令如下,我调用hql=[select * from hive_combine_test where rdm > 50000;],这将花费9个映射器,与hdfs中的文件数量相同。

CREATE EXTERNAL table hive_combine_test
(id string, 
rdm string)
PARTITIONED BY (dateid string)
row format delimited fields terminated by '\t'
stored as textfile;

ALTER TABLE hive_combine_test
ADD PARTITION (dateid='20140901')
location '/root/20140901';

ALTER TABLE hive_combine_test
ADD PARTITION (dateid='20140902')
location '/root/20140902';

ALTER TABLE hive_combine_test
ADD PARTITION (dateid='20140903')
location '/root/20140903';

但是我想要的是把所有的part-i放在一个拆分中,这样应该只有三个映射器

我尝试从org.apache.hadoop.hive.ql.io.HiveInputFormat 继承,以测试自定义JudHiveInputFormat 是否可以工作。

public class JudHiveInputFormat<K extends WritableComparable, V extends Writable>
                    extends HiveInputFormat<WritableComparable, Writable> {

}

但是当我将它挂载在 hive 中时,它会返回异常:

hive> add jar /my_path/jud_udf.jar;
hive> set hive.input.format=com.judking.hive.inputformat.JudHiveInputFormat;
hive> select * from hive_combine_test where rdm > 50000;

java.lang.RuntimeException: com.judking.hive.inputformat.JudCombineHiveInputFormat
    at org.apache.hadoop.hive.ql.exec.mr.ExecDriver.execute(ExecDriver.java:290)
    at org.apache.hadoop.hive.ql.exec.mr.MapRedTask.execute(MapRedTask.java:136)
    at org.apache.hadoop.hive.ql.exec.Task.executeTask(Task.java:153)
    at org.apache.hadoop.hive.ql.exec.TaskRunner.runSequential(TaskRunner.java:85)
    at org.apache.hadoop.hive.ql.Driver.launchTask(Driver.java:1472)
    at org.apache.hadoop.hive.ql.Driver.execute(Driver.java:1239)
    at org.apache.hadoop.hive.ql.Driver.runInternal(Driver.java:1057)
    at org.apache.hadoop.hive.ql.Driver.run(Driver.java:880)
    at org.apache.hadoop.hive.ql.Driver.run(Driver.java:870)
    at org.apache.hadoop.hive.cli.CliDriver.processLocalCmd(CliDriver.java:268)
    at org.apache.hadoop.hive.cli.CliDriver.processCmd(CliDriver.java:220)
    at org.apache.hadoop.hive.cli.CliDriver.processLine(CliDriver.java:423)
    at org.apache.hadoop.hive.cli.CliDriver.executeDriver(CliDriver.java:792)
    at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:686)
    at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:625)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at org.apache.hadoop.util.RunJar.main(RunJar.java:212)

谁能给我一些线索?非常感谢!

【问题讨论】:

  • 你在 JudHiveInputFormat 中做什么?

标签: hadoop hive


【解决方案1】:

据我所知,要在 Hive 中添加自定义 INPUT/OUTPUT 格式,您需要在 create table 语句中提及该格式。像这样的东西:

CREATE TABLE (...)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' 
STORED AS INPUTFORMAT '<your input format class name >' OUTPUTFORMAT '<your output format class name>';

由于您只需要 InputFormat,因此您的 create table 语句将如下所示:

CREATE TABLE (...)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' 
STORED AS INPUTFORMAT 'JudHiveInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat';

为什么需要提到这个 OUTPUT 格式类,因为你已经覆盖了 INPUT 格式 Hive 也需要 OUTPUT 类,所以这里我们需要说 Hive 使用它的 DEFAULT OUTPUT 格式类。

也许你可以试一试。

希望对你有帮助...!!!

【讨论】:

    猜你喜欢
    • 2019-11-28
    • 1970-01-01
    • 2020-12-27
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    • 2021-07-26
    • 2016-09-13
    • 2021-11-24
    相关资源
    最近更新 更多