我是Nifi的新手。我正在研究读取文件内容并执行一些ETL的NiFiProject。结果需要放入不同的文件中。
我收到的关系不满意错误:
MyspanishprocessorIid-b673bb80-0169-1 ooo-2f8a-c22081380d29 Myspanishprocessodidzb673bb80-0169-1000-2f8a-c22081380d29无法 由于StandardFlowFileRecordluuidze8ee1374-ef25-43d5-b35e-而导致的处理会话 ac76dba0955c,claimzStandardContentClaim (resourceClaimzStandardResourceClaim(idz1554235475648-1,containerzdefault, 部分-Il,偏移量; O, 未指定转移关系;处理程序的管理产量为1秒: org.apache.nifi.processor.exception.FlowFileHandlingExceptlon: StandardFlowFileRecordluuidze8ee1374-ef25-43d5-b35e- ac76dba0955c,claimzStandardContentClaim (resourceClaimzStandardResourceClaim(idz1554235475648-1,容器默认值, 截面偏移; O, 传输关系未指定
我写的代码是:
@Tags({"spanish"})
@CapabilityDescription("Spanish processor")
@SeeAlso({})
@ReadsAttributes({@ReadsAttribute(attribute="", description="")})
@WritesAttributes({@WritesAttribute(attribute="", description="")})
public class MySpanishProcessor extends AbstractProcessor {
public static final PropertyDescriptor MY_PROPERTY = new PropertyDescriptor
.Builder().name("MY_PROPERTY")
.displayName("My property")
.description("Example Property")
.required(false)
.addValidator(StandardValidators.NON_EMPTY_VALIDATOR)
.build();
public static final Relationship REL_MATCH = new Relationship.Builder()
.name("matched")
.description("FlowFiles are routed to this relationship when the Regular Expression is successfully evaluated and the FlowFile is modified as a result")
.build();
public static final Relationship REL_NO_MATCH = new Relationship.Builder()
.name("unmatched")
.description("FlowFiles are routed to this relationship when no provided Regular Expression matches the content of the FlowFile")
.build();
private List<PropertyDescriptor> descriptors;
private Set<Relationship> relationships;
@Override
protected void init(final ProcessorInitializationContext context) {
final List<PropertyDescriptor> descriptors = new ArrayList<PropertyDescriptor>();
descriptors.add(MY_PROPERTY);
this.descriptors = Collections.unmodifiableList(descriptors);
final Set<Relationship> relationships = new HashSet<Relationship>();
relationships.add(REL_MATCH);
relationships.add(REL_NO_MATCH);
this.relationships = Collections.unmodifiableSet(relationships);
}
@Override
public Set<Relationship> getRelationships() {
return this.relationships;
}
@Override
public final List<PropertyDescriptor> getSupportedPropertyDescriptors() {
return descriptors;
}
@OnScheduled
public void onScheduled(final ProcessContext context) {
}
Table officeTable = null;
Table legalEntitytable = null;
Table citiesTable = null;
Table joinOfOfficeLegalCityTable = null;
@Override
public void onTrigger(final ProcessContext context, final ProcessSession session) throws ProcessException {
getLogger().debug("In the Trigger");
FlowFile flowFile = session.get();
if (flowFile == null) {
return;
}
//Lets read the file using the call back
ArrayList<String> lineList= new ArrayList<>();
session.read(flowFile, new InputStreamCallback() {
@Override
public void process(InputStream inputStream) throws IOException {
BufferedReader bufferedReader= new BufferedReader(new InputStreamReader(inputStream));
String line;
while ((line=bufferedReader.readLine())!=null)
{lineList.add(line);}
}
});
FlowFile flowFile1=session.create();
session.write(flowFile1, new OutputStreamCallback() {
@Override
public void process(OutputStream outputStream) throws IOException {
outputStream.write("No Data".getBytes());
}
});
// session.getProvenanceReporter().modifyAttributes(flowFile1);
session.transfer(flowFile1, REL_MATCH);//needs to be called to transfer
}
}
答案 0 :(得分:0)
每个流文件都必须考虑在内,这意味着从session.create创建或从session.get获取的任何流文件都必须被传输或删除。
任何session.write或session.putAttribute的结果将返回必须跟踪的新流文件引用。所以...
FlowFile flowFile1=session.create();
flowFile1 = session.write(flowFile1, new OutputStreamCallback() {
然后必须传输flowFile1。
答案 1 :(得分:0)
经过反复试验,以下代码有效。
@Override
public void onTrigger(final ProcessContext context, final ProcessSession session) throws ProcessException {
getLogger().debug("In the Trigger");
FlowFile flowFile = session.get();
if (flowFile == null) {
return;
}
//Lets read the file using the call back
ArrayList<String> lineList = new ArrayList<>();
final SpanishCodeFilePreprocessor spanishCodeFilePreprocessor = new SpanishCodeFilePreprocessor();
try {
session.read(flowFile, new InputStreamCallback() {
@Override
public void process(InputStream inputStream) throws IOException {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String line;
while ((line = bufferedReader.readLine()) != null) {
spanishCodeFilePreprocessor.identifyRecordTypeAndProcessIt(line);
}
}
});
}
catch (Exception e)
{
getLogger().error(e.toString());
}
try {
session.write(flowFile, new OutputStreamCallback() {
@Override
public void process(OutputStream outputStream) throws IOException {
officeTable=spanishCodeFilePreprocessor.getOfficeTable();
String s = "Office Table size: " + String.valueOf(officeTable.shape());
officeTable.write().csv(outputStream);
}
});
session.getProvenanceReporter().modifyAttributes(flowFile);
session.transfer(flowFile, REL_MATCH);//needs to be called to transfer
} catch (Exception e) {
getLogger().error("Exception in spanishProcessor");
session.write(flowFile, new OutputStreamCallback() {
@Override
public void process(OutputStream outputStream) throws IOException {
String s = "Office Table size: 0";
outputStream.write(s.getBytes());
}
});
session.getProvenanceReporter().modifyAttributes(flowFile);
session.transfer(flowFile, REL_NO_MATCH);//needs to be called to transfer
}
}