我一直在努力解决这个问题已经有一段时间了。这是我使用
的功能SparkConf conf = new SparkConf().setAppName(appName);
JavaStreamingContext ssc = new JavaStreamingContext(conf, Durations.minutes(1));
Map<String, Object> params = new HashMap<String, Object>() {{
put("bootstrap.servers", kafkaServers);
put("key.deserializer", kafkaKeyDeserializer);
put("value.deserializer", kafkaValueDeserializer);
}};
List<String> topics = new ArrayList<String>() {{
// Add Topics
}};
JavaInputDStream<ConsumerRecord<String, String>> stream =
KafkaUtils.createDirectStream(ssc,
LocationStrategies.PreferConsistent(),
ConsumerStrategies.<String, String>Subscribe(topics, params)
);
stream.foreachRDD(rdd -> rdd.groupBy(record -> record.value().getMessageId()));
ssc.start();
ssc.awaitTermination();
此代码的目的是将编码类型从UTF8更改为ISO-8859-1从XML文件。为此,我下载文件,将它们保存到我的服务器中,然后,使用上面粘贴的代码,打开所述文件,从XML中读取一行,然后将其再次粘贴到同一文件中。当我读取第一行(l_encabezado var为TRUE,然后为false)时,我将其更改为我选择的编码类型。第一个之后的每一行都按原样读取和粘贴。
我想,问题来自以下几行:
FUNCTION change_header_XML2 (l_nom_archivo IN VARCHAR2 DEFAULT NULL) RETURN number IS
F UTL_FILE.FILE_TYPE;
V_LINE VARCHAR2 (32767);
--File read variables
fileHandler UTL_FILE.FILE_TYPE;
-- Variables control
l_encabezado boolean := TRUE;
l_var1 varchar2(32767) := '';
l_tag_fin number := 0;
l_temp_var1 varchar2(32767) := 0;
BEGIN
--Open file from directory
F := UTL_FILE.FOPEN ('/home/dir1/dir2/', l_nom_archivo, 'R', 32767); --path for reading file
fileHandler:=utl_file.fopen('/dir3/',l_nom_archivo,'W'); --Creates a new file
IF UTL_FILE.IS_OPEN(F) THEN
LOOP
BEGIN --Reads XML line by line until EOF
UTL_FILE.GET_LINE(F, V_LINE, 1000);
IF V_LINE IS NULL THEN
EXIT;
END IF;
IF (l_encabezado) THEN --changes the encoding of XML from UTF8 to ISO-8859-1
l_encabezado := FALSE;
l_var1 := '<?xml version="1.0" encoding="ISO-8859-1"?>';
ELSE
l_var1 := V_LINE; -- reads everything else
END IF;
UTL_FILE.put_line(fileHandler, CONVERT(l_var1, 'WE8ISO8859P1', 'UTF8')); --Inputs the readed line into the file. *Here is where the length trims the xml tag*
utl_file.fflush(fileHandler); --Save file in dir
EXCEPTION
WHEN NO_DATA_FOUND THEN
EXIT;
WHEN OTHERS THEN
HTP.P('<br><BR>An error was encountered - '||SQLCODE||' -ERROR- '||SQLERRM);
END;
END LOOP;
ELSE
HTP.P('The File dosent exists');
dbms_output.put_line('The File dosent exists');
END IF;
UTL_FILE.FCLOSE(F);
--Closes file
utl_file.fflush(fileHandler);
UTL_FILE.FCLOSE(fileHandler);
return 1;
EXCEPTION
WHEN OTHERS THEN
HTP.P('<br>An error was encountered - '||SQLCODE||' -ERROR- '||SQLERRM);
dbms_output.put_line(SUBSTR( SQLERRM|| ', ' || DBMS_UTILITY.FORMAT_ERROR_BACKTRACE(),0,999));
END change_header_XML2;
当文件中的一行太长时,UTL_FILE会剪切该行并将其粘贴到文件中,然后继续读取它,然后将其余部分粘贴到之前发布的下一行的下一行。这对普通文本很好,但有时我的XML结束标记会被修剪,如下图所示:
job_Major_List结束标记在2个单独的行中被切断,这完全打破了XML文件。我尝试为函数UTL_FILE.GET_LINE更改1000 PLS_INTEGER的值但是无法使其工作,我似乎无法理解PLS_INTEGER的工作原理。
答案 0 :(得分:0)
您正在使用UTL_FILE.PUT_LINE
引入不需要的行终结符字符,而是使用UTL_FILE.PUT
。