- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我已经开始为我们的一个项目使用 Apache Pig。我必须创建自定义输入格式来加载我们的数据文件。为此,我遵循了这个例子 Hadoop:Custom Input format .我还创建了自定义 RecordReader 实现来读取数据(我们从其他应用程序获取二进制格式的数据)并将其解析为正确的 JSON 格式。
当我在 Pig 脚本中使用我的自定义加载器时出现问题。一旦调用我的加载器的 getNext() 方法,它就会调用我的自定义 RecordReader 的 nextKeyValue() 方法,该方法工作正常。它正确读取数据,将其传递回我的加载程序,后者解析数据并返回一个元组。到目前为止一切顺利。
当我的加载程序的 getNext() 方法被一次又一次地调用时,问题就出现了。它被调用,工作正常,并返回正确的输出(我调试它直到 return 语句)。但是,我的加载器没有让执行更进一步,而是再次被调用。我试着查看我的加载器被调用的次数,我可以看到这个数字一直到 20K!
有人可以帮我理解我的代码中的问题吗?
加载器
public class SimpleTextLoaderCustomFormat extends LoadFunc {
protected RecordReader in = null;
private byte fieldDel = '\t';
private ArrayList<Object> mProtoTuple = null;
private TupleFactory mTupleFactory = TupleFactory.getInstance();
@Override
public Tuple getNext() throws IOException {
Tuple t = null;
try {
boolean notDone = in.nextKeyValue();
if (!notDone) {
return null;
}
String value = (String) in.getCurrentValue();
byte[] buf = value.getBytes();
int len = value.length();
int start = 0;
for (int i = 0; i < len; i++) {
if (buf[i] == fieldDel) {
readField(buf, start, i);
start = i + 1;
}
}
// pick up the last field
readField(buf, start, len);
t = mTupleFactory.newTupleNoCopy(mProtoTuple);
mProtoTuple = null;
} catch (InterruptedException e) {
int errCode = 6018;
String errMsg = "Error while reading input";
e.printStackTrace();
throw new ExecException(errMsg, errCode,
PigException.REMOTE_ENVIRONMENT, e);
}
return t;
}
private void readField(byte[] buf, int start, int end) {
if (mProtoTuple == null) {
mProtoTuple = new ArrayList<Object>();
}
if (start == end) {
// NULL value
mProtoTuple.add(null);
} else {
mProtoTuple.add(new DataByteArray(buf, start, end));
}
}
@Override
public InputFormat getInputFormat() throws IOException {
//return new TextInputFormat();
return new CustomStringInputFormat();
}
@Override
public void setLocation(String location, Job job) throws IOException {
FileInputFormat.setInputPaths(job, location);
}
@Override
public void prepareToRead(RecordReader reader, PigSplit split)
throws IOException {
in = reader;
}
自定义输入格式
public class CustomStringInputFormat extends FileInputFormat<String, String> {
@Override
public RecordReader<String, String> createRecordReader(InputSplit arg0,
TaskAttemptContext arg1) throws IOException, InterruptedException {
return new CustomStringInputRecordReader();
}
}
自定义 RecordReader
public class CustomStringInputRecordReader extends RecordReader<String, String> {
private String fileName = null;
private String data = null;
private Path file = null;
private Configuration jc = null;
private static int count = 0;
@Override
public void close() throws IOException {
// jc = null;
// file = null;
}
@Override
public String getCurrentKey() throws IOException, InterruptedException {
return fileName;
}
@Override
public String getCurrentValue() throws IOException, InterruptedException {
return data;
}
@Override
public float getProgress() throws IOException, InterruptedException {
return 0;
}
@Override
public void initialize(InputSplit genericSplit, TaskAttemptContext context)
throws IOException, InterruptedException {
FileSplit split = (FileSplit) genericSplit;
file = split.getPath();
jc = context.getConfiguration();
}
@Override
public boolean nextKeyValue() throws IOException, InterruptedException {
InputStream is = FileSystem.get(jc).open(file);
StringWriter writer = new StringWriter();
IOUtils.copy(is, writer, "UTF-8");
data = writer.toString();
fileName = file.getName();
writer.close();
is.close();
System.out.println("Count : " + ++count);
return true;
}
}
最佳答案
在加载器中试试这个
//....
boolean notDone = ((CustomStringInputFormat)in).nextKeyValue();
//...
Text value = new Text(((CustomStringInputFormat))in.getCurrentValue().toString())
关于java - PIG Custom loader 的 getNext() 被一次又一次地调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26113315/
我想实现一个 LinkedListremove 方法,该方法可以删除任何特定位置的项目,但在本例中,我最感兴趣的是删除列表开头(第 0 个位置)的项目。 我的代码适用于 n 大于零的值,因此我为 n=
我是 Java 和 StackOverflow 的新手,所以请不要刻薄。我真的很感激一些帮助。先谢谢你。 我觉得这真的很简单,我已经尝试过一百万种不同的方法,但它不起作用。 我正在尝试获取一个文本文件
我试图弄清楚为什么 ResultSet.next() 在我编写的 Java 代码中永远不会成立,在执行 SQL 查询后,该查询将 Oracle 11g 表中的结果返回到该 ResultSet 中...
我有一个带有静态方法 getNext() 的单例类 public class Sequence { private static Sequence instance; private s
我正在使用树的 SNMPWalk 的 GetNext 操作示例之一。我正在使用异步变体来收集 OID - # GETNEXT Command Generator from pysnmp.entity.
我正在为交换链表中节点的算法编写伪代码,并有一个简单的问题:.next 和 .getNext() 之间有区别吗? 其中一个是我知道的方法,但我想知道它们是否相同: 如果不是,您能解释一下为什么其中一个
这更像是一个设计层面的问题。我有一个持久类,它通过 SQL 查询从数据库中查询记录,并通过一个名为 getNext() 的成员函数返回给调用者,该函数的签名如下: int getNext(); //
我正在扩展 LoadFunc。在 getNext 函数中,我想跳过在某些条件下返回元组的步骤——这样我只能加载数据文件的样本。我尝试为不想返回的行返回 null,但问题是该方法在返回第一个 null
tensorflow 推荐使用 tf.data.Dataset 导入数据。如果图像的验证大小与训练图像不同,是否可以将其用于验证和训练? import tensorflow as tf import
您好,我的数据集迭代器突然遇到问题。我已经看到关于堆栈溢出的类似问题,但没有一个能够对我的情况有所帮助,所以我将其发布在这里。 当我在训练后创建验证迭代器时,我的代码运行完美。但现在我想看看损失在测试
这是《Java 中的数据结构和算法(第六版)》一书的代码片段,该方法是 LinkedPositionalList 实现的一部分。我不明白该行到底是什么意思: “if (node.getNext( )
我正在尝试创建一个简单的 snmp GETNEXT 查询来仅检索树层次结构中给定 OID 的下一项。 例如,我想要的是: 当我使用 OID 1.3.6.1.2.1.1 (iso.org.dod.int
我正在尝试解析带有 html 代码的页面,如下所示: .. Identified Header... ... ... ... .. 我正在使用 Python 代码通过 lxml 解
在 C++ 中,我经常使用以下模式: while (int i = getNextElementPlease()) { printf("%d\n", i); } 但是在 python 中我必须
我对java相当陌生,希望有人能够帮助我。我正在尝试创建一个链接列表来比较中奖号码和玩家号码,因为您可以在我的彩票计划中使用不同的名称购买多张彩票。该程序可以工作,但它只输出最后一张票的结果,而不是全
我在进行预测时为输入数据构建了一个数据集管道。但是,当我尝试代码时,发生了错误 FailedPreconditionError (see above for traceback): GetNext()
我建立了一个专门的类来构建、训练、保存然后加载我的模型。保存是通过 tf.saved_model.simple_save 完成的,然后通过 tf.saved_model.loader.load 恢复的
我已经开始为我们的一个项目使用 Apache Pig。我必须创建自定义输入格式来加载我们的数据文件。为此,我遵循了这个例子 Hadoop:Custom Input format .我还创建了自定义 R
我想要一个通用解决方案,但作为示例,假设我有一个 IEnumerable ,其中有些可以解析为整数,有些则不能。 var strings = new string[] { "1", "2", "not
这是来自 John Resig's blog关于 JSON 响应被盗: // From Joe Walker function Array() { var obj = this; var in
我是一名优秀的程序员,十分优秀!