gpt4 book ai didi

python - 如何在 python 中从 HDFS sequencefile 加载数据

转载 作者:可可西里 更新时间:2023-11-01 15:02:18 27 4
gpt4 key购买 nike

我有一个 map reduce 程序正在运行以读取 HDFS 文件,如下所示:

hadoop jar /opt/mapr/hadoop/hadoop-0.20.2/contrib/streaming/hadoop-0.20.2-dev-streaming.jar -Dmapred.reduce.tasks=1000  -file $homedir/mapper.py -mapper $homedir/mapper.py -file $homedir/reducer.py -reducer $homedir/reducer.py   -input /user/data/* -output /output/ 2> output.text

有什么需要确认的,路径/user/data/* 有包含文件的文件夹,/user/data/* 会遍历所有子文件夹下的所有文件,对吗?

hdfs 文本文件的每一行都包含一个 JSON 字符串,因此映射器按如下方式读取文件:

for line in sys.stdin:
try:
object = json.loads(line)

但是 HDFS 的所有者将文件从文本更改为序列文件。我发现 map reduce 程序输出了很多零大小的文件,这可能意味着它没有成功地从 HDFS 读取文件。

我应该更改什么代码才能从序列文件中读取?我还有一个 HIVE 外部表来根据 mapreduce 的输出执行聚合和排序,并且 HIVE 之前被存储为文本文件,我应该更改为存储为序列文件吗?

谢谢,

最佳答案

看看this

在 mapreduce 作业之前运行下面的 python 文件
输入:你的序列文件
输出:你对 mapreduce 的输入

import sys

from hadoop.io import SequenceFile

if __name__ == '__main__':
if len(sys.argv) < 3:
print 'usage: SequenceFileReader <filename> <output>'
else:
reader = SequenceFile.Reader(sys.argv[1])

key_class = reader.getKeyClass()
value_class = reader.getValueClass()

key = key_class()
value = value_class()

#reader.sync(4042)
position = reader.getPosition()
f = open(sys.argv[2],'w')
while reader.next(key, value):
f.write(value.toString()+'\n')
reader.close()
f.close()

您现在不必更改原始 python 文件。

关于python - 如何在 python 中从 HDFS sequencefile 加载数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33684625/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com