我是hadoop的新手,我对map-reduce编程的风格越来越熟悉,但现在我遇到了一个问题:有时候我只需要映射一个工作而我只需要将地图结果直接作为输出,这意味着减少这里不需要阶段,我该如何实现?
这是下面的Hive表
CREATE EXTERNAL TABLE IF NOT EXISTS SampleTable
(
USER_ID BIGINT,
NEW_ITEM ARRAY<STRUCT<PRODUCT_ID: BIGINT,TIMESTAMPS:STRING>>
)
Run Code Online (Sandbox Code Playgroud)
这是上表中的数据 -
1015826235 [{"product_id":220003038067,"timestamps":"1340321132000"},{"product_id":300003861266,"timestamps":"1340271857000"}]
Run Code Online (Sandbox Code Playgroud)
有什么办法可以在爆炸阵列后从HiveQL获得以下输出吗?
**USER_ID** | **PRODUCT_ID** | **TIMESTAMPS**
------------+------------------+----------------
1015826235 220003038067 1340321132000
1015826235 300003861266 1340271857000
Run Code Online (Sandbox Code Playgroud)
更新
我写了这个查询以获得上述格式的输出,但它并没有按照我想要的方式给出结果.
SELECT myTable1.myCol1,myTable2.myCol2 FROM sampletable st LATERAL VIEW
explode(st.purchased_item.product_id) myTable1 AS myCol1 LATERAL VIEW
explode(st.purchased_item.timestamps) myTable2 AS myCol2;
Run Code Online (Sandbox Code Playgroud)
任何人都可以帮我解决我的错误吗?任何建议将不胜感激.
如何在映射器中获取输入文件的名称?我有多个输入文件存储在输入目录中,每个映射器可能会读取不同的文件,我需要知道映射器已读取的文件.
关于何时使用group(),与$ group或mapreduce聚合,我有点困惑.我在http://www.mongodb.org/display/DOCS/Aggregation上阅读了针对group()的文档,http://docs.mongodb.org/manual/reference/aggregation/group/#_S_group for $ group ..分片是否group()不起作用的唯一情况?另外,我觉得$ group比group()更强大,因为它可以与聚合框架中的其他管道运算符一起使用.$ group如何与mapreduce进行比较?我在某处读到它不生成任何临时集合,而mapreduce则生成.是这样吗?
有人可以提供插图或指导我一起解释这三个概念的链接,采用相同的样本数据,以便我可以轻松地比较它们吗?
编辑:
此外,如果您可以在这些命令中指出任何新的东西,那将是很好的,因为新的2.2版本出来了..
为什么Apache的hadoop包树中有两个独立的包map-reduce包:
org.apache.hadoop.mapred
Run Code Online (Sandbox Code Playgroud)
http://javasourcecode.org/html/open-source/hadoop/hadoop-1.0.3/org/apache/hadoop/mapred/
org.apache.hadoop.mapreduce
Run Code Online (Sandbox Code Playgroud)
http://javasourcecode.org/html/open-source/hadoop/hadoop-1.0.3/org/apache/hadoop/mapreduce/
他们为什么被分开了?有文件说明这一点吗?
我目前正在运行一项工作,我将地图任务的数量修改为20,但获得更高的数字.我还将reduce任务设置为零,但我仍然得到一个非零的数字.MapReduce作业完成的总时间也不会显示.有人能告诉我我做错了什么.我正在使用此命令
hadoop jar Test_Parallel_for.jar Test_Parallel_for Matrix/test4.txt Result 3 \ -D mapred.map.tasks = 20 \ -D mapred.reduce.tasks =0
Run Code Online (Sandbox Code Playgroud)
输出:
11/07/30 19:48:56 INFO mapred.JobClient: Job complete: job_201107291018_0164
11/07/30 19:48:56 INFO mapred.JobClient: Counters: 18
11/07/30 19:48:56 INFO mapred.JobClient: Job Counters
11/07/30 19:48:56 INFO mapred.JobClient: Launched reduce tasks=13
11/07/30 19:48:56 INFO mapred.JobClient: Rack-local map tasks=12
11/07/30 19:48:56 INFO mapred.JobClient: Launched map tasks=24
11/07/30 19:48:56 INFO mapred.JobClient: Data-local map tasks=12
11/07/30 19:48:56 INFO mapred.JobClient: FileSystemCounters
11/07/30 19:48:56 INFO mapred.JobClient: FILE_BYTES_READ=4020792636
11/07/30 19:48:56 INFO mapred.JobClient: HDFS_BYTES_READ=1556534680 …Run Code Online (Sandbox Code Playgroud) 虽然我经常在我的Ubuntu机器上使用Hadoop,但我从未想过SUCCESS和part-r-00000文件.输出总是驻留在part-r-00000文件中,但文件的用途是SUCCESS什么?为什么输出文件有名字part-r-0000?是否有任何意义/任何命名法或者这只是随机定义的?
YARN的容器是什么?它是与nodemanager上运行的任务运行的子JVM相同还是不同?
我们有一个大型数据集来分析多个reduce函数.
所有reduce算法都在同一个map函数生成的同一数据集上工作.读取大型数据集每次都要花费太多,最好只读取一次并将映射数据传递给多个reduce函数.
我可以用Hadoop做到这一点吗?我搜索过这些例子和intarweb,但我找不到任何解决方案.
我的地图任务需要一些配置数据,我想通过分布式缓存分发.
Hadoop MapReduce教程显示了DistributedCache类的用法,大致如下:
// In the driver
JobConf conf = new JobConf(getConf(), WordCount.class);
...
DistributedCache.addCacheFile(new Path(filename).toUri(), conf);
// In the mapper
Path[] myCacheFiles = DistributedCache.getLocalCacheFiles(job);
...
Run Code Online (Sandbox Code Playgroud)
然而,DistributedCache在为过时标记中的Hadoop 2.2.0.
实现这一目标的新方法是什么?是否有涵盖此API的最新示例或教程?