write as工具跟writeas作品集

1.1DataSink數據輸出

經過壹係列Transformation轉換操作後,最後壹定要調用Sink操作,才會形成壹個完整的DataFlow拓撲。衹有調用了Sink操作,才會產生最終的計算結果,這些數據可以寫入到的文件、輸出到指定的網絡端口、消息中間件、外部的文件係統或者是打印到控制臺。

1.1.1print 打印

打印是最簡單的壹個Sink,通常是用來做實驗和測試時使用。如果想讓壹個DataStream輸出打印的結果,直接可以在該DataStream調用print方法。另外,該方法還有壹個重載的方法,可以傳入壹個字符,指定壹個Sink的標識名稱,如果有多個打印的Sink,用來區分到底是哪壹個Sink的輸出。

import org.apache.flink.api.common.functions.FlatMapFunction; import org.apache.flink.api.common.functions.RuntimeContext; import org.apache.flink.configuration.Configuration; import org.apache.flink.streaming.api.datastream.DataStreamSource; import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; import org.apache.flink.streaming.api.functions.sink.RichSinkFunction; import org.apache.flink.util.Collector; public class PrintSinkDemo { public static void main(String[] args) throws Exception { //local模式默認的並行度是當前機器的邏輯核的數量 Configuration configuration = new Configuration(); StreamExecutionEnvironment env = StreamExecutionEnvironment.createLocalEnvironmentWithWebUI(configuration); int parallelism0 = env.getParallelism(); System.out.println("執行環境默認的並行度:" + parallelism0); DataStreamSource lines = env.socketTextStream("cs-28-86", 8888); //獲取DataStream的並行度 int parallelism = lines.getParallelism(); System.out.println("SocketSource的並行度:" + parallelism); lines.print(); //lines.addSink(new MyPrintSink()).name("my-print-sink"); env.execute(); } public static class MyPrintSink extends RichSinkFunction { private int indexOfThisSubtask; @Override public void open(Configuration parameters) throws Exception { RuntimeContext runtimeContext = getRuntimeContext(); indexOfThisSubtask = runtimeContext.getIndexOfThisSubtask(); } @Override public void invoke(String value, Context context) throws Exception { System.out.println(indexOfThisSubtask + 1 + "> " + value); } } }

下麵的結果是WordCount例子中調用print Sink輸出在控制臺的結果,細心的讀者會發現,在輸出的單詞和次數之前,有壹個數字前綴,我這里是1~4,這個數字是該Sink所在subtask的Index + 1。有的讀者運行的結果數字前綴是1~8,該數字前綴其實是與任務的並行度相關的,由於該任務是以local模式運行,默認的並行度是所在機器可用的邏輯核數即線程數,我的電腦是2核4線程的,所以subtask的Index範圍是0~3,將Index + 1,顯示的數字前綴就是1~4了。這里在來仔細的觀察壹下運行的結果發現:相同的單詞輸出結果的數字前綴壹定相同,即經過keyBy之後,相同的單詞會被shuffle到同壹個subtask中,並且在同壹個subtask的同壹個組內進行聚合。壹個subtask中是可能有零到多個組的,如果是有多個組,每壹個組是相互獨立的,累加的結果不會相互幹擾。

1.1.2writerAsText 以文本格式輸出

該方法是將數據以文本格式實時的寫入到指定的目錄中,本質上使用的是TextOutputFormat格式寫入的。每輸出壹個元素,在該內容後麵同時追加壹個換行符,最終以字符的形式寫入到文件中,目錄中的文件名稱是該Sink所在subtask的Index + 1。該方法還有壹個重載的方法,可以額外指定壹個枚舉類型的參數writeMode,默認是WriteMode.NO_OVERWRITE,如果指定相同輸出目錄下有相同的名稱文件存在,就會出現異常。如果是WriteMode.OVERWRITE,會將以前的文件覆蓋。

import org.apache.flink.api.common.functions.RuntimeContext; import org.apache.flink.configuration.Configuration; import org.apache.flink.streaming.api.datastream.DataStreamSource; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; import org.apache.flink.streaming.api.functions.sink.RichSinkFunction; public class WriteSinkDemo { public static void main(String[] args) throws Exception { //local模式默認的並行度是當前機器的邏輯核的數量 Configuration configuration = new Configuration(); StreamExecutionEnvironment env = StreamExecutionEnvironment.createLocalEnvironmentWithWebUI(configuration); int parallelism0 = env.getParallelism(); System.out.println("執行環境默認的並行度:" + parallelism0); DataStreamSource lines = env.socketTextStream("localhost", 8888); //獲取DataStream的並行度 int parallelism = lines.getParallelism(); System.out.println("SocketSource的並行度:" + parallelism); lines.writeAsText("file:///Users/xing/Desktop/out"); env.execute(); } public static class MyPrintSink extends RichSinkFunction { private int indexOfThisSubtask; @Override public void open(Configuration parameters) throws Exception { RuntimeContext runtimeContext = getRuntimeContext(); indexOfThisSubtask = runtimeContext.getIndexOfThisSubtask(); } @Override public void invoke(String value, Context context) throws Exception { System.out.println(indexOfThisSubtask + 1 + "> " + value); } } }

1.1.3writeAsCsv 以csv格式輸出

該方法是將數據以csv格式寫入到指定的目錄中,本質上使用的是CsvOutputFormat格式寫入的。每輸出壹個元素,在該內容後麵同時追加壹個換行符,最終以csv的形式(類似Excel的格式,字段和字段之間用逗號分隔)寫入到文件中,目錄中的文件名稱是該Sink所在subtask的Index + 1。需要說明的是,該Sink並不是將數據實時的寫入到文件中,而是有壹個BufferedOutputStream,默認緩存的大小為4096個字節,衹有達到這個大小,才會flush到磁盤。另外程序在正常退出,調用Sink的close方法也會flush到磁盤。

DataStream> result = wordAndOne.keyBy(0).sum(1); result.writeAsCsv(path);1.1.4writeUsingOutputFormat以指定的格式輸出

該方法是將數據已指定的格式寫入到指定目錄中,該方法要傳入壹個OutputFormat接口的實現類,該接口有很多已經實現好了的實現類,並且可以根據需求自己實現,所以該方法更加靈活。writeAsText和writeAsCsv方法底層都是調用了writeUsingOutputFormat方法。

DataStream> result = wordAndOne.keyBy(0).sum(1); result.writeUsingOutputFormat(new TextOutputFormat<>(new Path(path));1.1.5writeToSocket輸出到網絡端口

該方法是將數據輸出到指定的Socket網絡地址端口。該方法需要傳入三個參數:第壹個為ip地址或主機名,第二個為端口號,第三個為數據輸出的序列化格式SerializationSchema。輸出之前,指定的網絡端口服務必須已經啟動。

DataStreamSource lines = env.socketTextStream(“localhost”, 8888); lines.writeToSocket(“localhost”, 9999, new SimpleStringSchema());1.1.6RedisSink

該方法是將數據輸出到Redis數據庫中,Redis是壹個基於內存、性能極高的NoSQL數據庫,數據還可以持久化到磁盤,讀寫速度快,適合存儲key-value類型的數據。Redis不僅僅支持簡單的key-value類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。Flink實時計算出的結果,需要快速的輸出存儲起來,要求寫入的存儲係統的速度要快,這個才不會造成數據積壓。Redis就是壹個非常不錯的選擇。

首先在maven項目中的pom.xml中添加Redis Sink的依賴。

org.apache.bahir flink-connector-redis_${scala.binary.version} 1.1-SNAPSHOT

接下來就是定義壹個類(或者靜態內部類)實現RedisMapper即可,需要指定壹個泛型,這里是Tuple2,即寫入到Redis中的數據的類型,並實現三個方法。第壹個方法是getCommandDescription方法,返回RedisCommandDescription實例,在該構造方法中可以指定寫入到Redis的方法類型為HSET,和Redis的additionalKey即value為HASH類型外面key的值;第二個方法getKeyFromData是指定value為HASH類型對應key的值;第三個方法geVauleFromData是指定value為HASH類型對應value的值。

在使用之前,先new FlinkJedisPoolConfig,設置Redis的ip地址或主機名、端口號、密碼等。然後new RedisSink將準備好的conf和RedisWordCountMapper實例傳入到其構造方法中,最後調用DataStream的addSink方法,將new好的RedisSink作為參數傳入。

import org.apache.flink.api.common.functions.FlatMapFunction; import org.apache.flink.api.java.functions.KeySelector; import org.apache.flink.api.java.tuple.Tuple2; import org.apache.flink.streaming.api.datastream.DataStreamSource; import org.apache.flink.streaming.api.datastream.KeyedStream; import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; import org.apache.flink.streaming.connectors.redis.RedisSink; import org.apache.flink.streaming.connectors.redis.common.config.FlinkJedisPoolConfig; import org.apache.flink.streaming.connectors.redis.common.mapper.RedisCommand; import org.apache.flink.streaming.connectors.redis.common.mapper.RedisCommandDescription; import org.apache.flink.streaming.connectors.redis.common.mapper.RedisMapper; import org.apache.flink.util.Collector; /** * 從指定的socket讀取數據,對單詞進行計算,將結果寫入到Redis中 */ public class RedisSinkDemo { public static void main(String[] args) throws Exception { //創建Flink流計算執行環境 StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); //創建DataStream //Source DataStreamSource lines = env.socketTextStream("cs-28-86", 8888); //調用Transformation開始 //調用Transformation SingleOutputStreamOperator> wordAndOne = lines.flatMap(new FlatMapFunction>() { @Override public void flatMap(String line, Collector> collector) throws Exception { String[] words = line.split(" "); for (String word : words) { //new Tuple2(word, 1) collector.collect(Tuple2.of(word, 1)); } } }); //分組 KeyedStream, String> keyed = wordAndOne.keyBy(new KeySelector, String>() { @Override public String getKey(Tuple2 tp) throws Exception { return tp.f0; } }); //聚合 SingleOutputStreamOperator> summed = keyed.sum(1); //Transformation結束 //調用Sink //summed.addSink() FlinkJedisPoolConfig conf = new FlinkJedisPoolConfig.Builder().setHost("localhost").setDatabase(0).build(); summed.addSink(new RedisSink>(conf, new RedisWordCountMapper())); //啟動執行 env.execute("StreamingWordCount"); } public static class RedisWordCountMapper implements RedisMapper> { @Override public RedisCommandDescription getCommandDescription() { return new RedisCommandDescription(RedisCommand.HSET, "WORD_COUNT"); } @Override public String getKeyFromData(Tuple2 data) { return data.f0; } @Override public String getValueFromData(Tuple2 data) { return data.f1.toString(); } } }1.1.7KafkaSink

在實際的生產環境中,經常會有壹些場景,需要將Flink處理後的數據快速地寫入到壹個分布式、高吞吐、高可用、可用保證Exactly Once的消息中間件中,供其他的應用消費處理後的數據。Kafka就是Flink最好的黃金搭檔,Flink不但可以從Kafka中消費數據,還可以將處理後的數據寫入到Kafka,並且吞吐量高、數據安全、可以保證Exactly Once等。

Flink可以和Kafka多個版本整合,比如0.11.x、1.x、2.x等,從Flink1.9開始,使用的是kafka 2.2的客戶端,所以這里使用kafka的版本是2.2.2,並且使用最新的API。

下麵的例子就是將數據寫入到Kafka中,首先要定義壹個類實現KafkaSerializationSchema接口,指定壹個泛型,String代表要寫入到Kafka的數據為String類型。該類的功能是指定寫入到Kafka中數據的序列化Schema,需要重寫serialize方法,將要寫入的數據轉成二進制數組,並封裝到壹個ProducerRecord中返回。

import org.apache.flink.api.common.functions.RuntimeContext; import org.apache.flink.api.common.serialization.SimpleStringSchema; import org.apache.flink.configuration.Configuration; import org.apache.flink.streaming.api.datastream.DataStreamSource; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; import org.apache.flink.streaming.api.functions.sink.RichSinkFunction; import org.apache.flink.streaming.connectors.kafka.FlinkKafkaProducer; public class KafkaSinkDemo { public static void main(String[] args) throws Exception { //local模式默認的並行度是當前機器的邏輯核的數量 Configuration configuration = new Configuration(); StreamExecutionEnvironment env = StreamExecutionEnvironment.createLocalEnvironmentWithWebUI(configuration); int parallelism0 = env.getParallelism(); System.out.println("執行環境默認的並行度:" + parallelism0); DataStreamSource lines = env.socketTextStream("cs-28-86", 8888); //獲取DataStream的並行度 int parallelism = lines.getParallelism(); System.out.println("SocketSource的並行度:" + parallelism); //lines.writeAsText("file:///Users/xing/Desktop/out"); FlinkKafkaProducer kafkaProducer = new FlinkKafkaProducer<>( "cs-28-87:9092,cs-28-88:9092,cs-28-89:9092", "wordcount18", new SimpleStringSchema() ); lines.addSink(kafkaProducer); env.execute(); } }

啟動nc –lk 8888 ,然後啟動上述代碼程序;

在nc窗口中輸入數據,使用kafka可以消費到;

kafka消費wordcount18的topic:

[root@cs-28-88 ~]# kafka-console-consumer --zookeeper cs-28-88:2181 --topic wordcount18

然後將Kafka相關的參數設置到Properties中,再new FlinkKafkaProducer,將要寫入的topic名稱、Kafka序列化Schema、Properties和寫入到Kafka的Semantic語義作為FlinkKafkaProducer構造方法參數傳入。最好調用addSink方法將FlinkKafkaProducer的引用傳入到該方法中。雖然下麵的代碼指定了EXACTLY_ONCE語義,但是沒有開啟Checkpointing,是沒法實現的。具有怎樣實現Exactly Once,會在後麵原理深入的章節進行講解。

1.1.8StreamFileDataSink

實時處理的數據,有壹些場景要輸出到其他分布式文件係統中,比如Hadoop HDFS、Amazon S3 (Simple Storage Service)、Aliyun OSS(Object Storage Service)等。因為這些分布式文件係統都具有高可用、可擴展、多副本、存儲海量數據等特點。存儲到分布式文件係統的數據,就可以做壹些離線的數據分析,比如離線的數倉、數據挖掘、機器學習等。

從Flink 1.9開始,原來的Bucketing Sink已經標記為過時,在未來的版本將會被移除。推薦使用StreamFileDataSink,該Sink不但可以將數據寫入到各種文件係統中,可以保證Exacly Once語義,還支持以列式存儲的格式寫入,功能更強大。

下麵的例子是將數據寫入到HDFS中,首先在maven項目的pom.xml文件引入HDFS文件係統的依賴:

org.apache.flink flink-connector-filesystem_2.12 1.12-SNAPSHOT org.apache.hadoop hadoop-client 2.6.0

通過DefaultRollingPolicy這個工具類,指定文件滾動生成的策略。這里設置的文件滾動生成策略有兩個,壹個是距離上壹次生成文件時間超過30秒,另壹個是文件大小達到100 mb。這兩個條件衹要滿足其中壹個即可滾動生成文件。然後StreamingFileSink.forRowFormat方法將文件輸出目錄、文件寫入的編碼傳入,再調用withRollingPolicy關聯上麵的文件滾動生成策略,接著調用build方法構建好StreamingFileSink,最後將其作為參數傳入到addSink方法中。

1.1.9 JDBCSink

package com.bigdata.sink; import com.bigdata.utils.DateUtil; import org.apache.flink.api.common.typeinfo.Types; import org.apache.flink.connector.jdbc.JdbcConnectionOptions; import org.apache.flink.connector.jdbc.JdbcSink; import org.apache.flink.streaming.api.datastream.DataStreamSource; import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; import org.apache.flink.util.Collector; import java.util.Arrays; import java.util.List; /**** * @author songshiming * @date 2022/12/10 * @desc */ public class SinkToMySql2 { public static void main(String[] args) throws Exception { System.out.println("start="+ DateUtil.getCurrentdatetime()); StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); // DataStreamSource lineDataStreamSource = env.readTextFile("input/200.csv"); DataStreamSource lineDataStreamSource = env.readTextFile("E://t1_trxrecord_20220821_V2.csv","gb2312"); SingleOutputStreamOperator> wordList = lineDataStreamSource.flatMap((String line, Collector> out) -> { // line = new String(line.getBytes("utf-8"),"gbk"); // System.out.println("line="+line); String[] words = line.split(","); out.collect(Arrays.asList(words)); }).returns(Types.LIST(Types.STRING)); String sqlStr ="INSERT INTO db_test.test_t1(TRXID, PARENT_TRXID, MERCHANT_NO, BRANCH_OFFICE, EXPAND_ORG, MAINTENANCE_ORG, STORE_CD, TERMINAL_NO, TRADE_TIME, SETTLEMENT_DATE, PRODUCT_NAME, TRADE_TP, TRADE_STA, TRADE_CARD_NO, TRADE_CARD_TP, ISSUER_CODE, TRADE_INIT_AMT, TRADE_AMT, BILLING_CYCLE, FEE_COLLECTION_STA, MER_FEE, SYSTEM_COST, BRAND_FEE, NET_PROFIT, MCC18, MCC42, ACCOUNT_ID, BUSINESS_TYPE, ORDER_NO, OTHER_MER_NO, OTHER_ACCOUNT_NO, SUBMIT_WAYS, TERMINAL_CODE, TERMINAL_BATCH, TERMINAL_TRACK_NO, TRADE_REFERENCE_NO, CHANNEL_NO, CHANNEL_MER_NO, TRADE_REMARKS, TRADE_ABSTRACT, TRADE_IP, CHANNEL_RET_CODE, SUBMIT_TIME, ERR_CODE, ERR_MSG, CHANNEL_TRADE_TP, INSTALLMENT_SUBSIDY_FEE, SUBSIDY_INFO, DCC_CURRENCY, DCC_AMT, DCC_EXCHANGE_RATE, PACKAGE_FEE, APP_ID, PACKAGE_ID) \n" + "VALUES \n" + "(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)" ; wordList.addSink(JdbcSink.sink( sqlStr, ((statement, word) -> { for (int i = 0; i < word.size(); i++) { String str = word.get(i).trim(); statement.setString(i+1, str ); } }), new JdbcConnectionOptions.JdbcConnectionOptionsBuilder() .withUrl("jdbc:mysql://192.168.0.11:3306/db_test?useUnicode=true&characterEncoding=utf8") .withDriverName("com.mysql.jdbc.Driver") .withUsername("root") .withPassword("123456") .build() )); env.execute(); System.out.println("start="+ DateUtil.getCurrentdatetime()); } }

如果妳向SCI期刊投過稿,那麽妳壹定收到過來自審稿人或編輯的回信。

最近,筆者剛把壹篇寫得比較水的手稿投到了壹本比較水的期刊,雖然寫得不咋樣,但是當時的筆者覺得這篇文章還不錯。

過了壹個月,筆者就收到審稿意見,裏面有某位審稿人的“友好”評論:

I read this paper several times but do not understand it. I cannot comment on the paper. It makes no sense.(我讀了幾遍但沒看懂。我無法評論這篇文章。牠毫無意義。)

就這樣,我的文章在壹審中悲劇了,咱就是說,筆者當時真的腳趾摳出了三室壹廳——也太尷尬(打擊人)了吧!

不知道大傢有沒有類似的投稿經歷:投稿前猛如虎,投稿後慫如狗

圖片來源:知乎@雞糟的黃醫桑

來自審稿人的毒舌

下麵是壹些網友們分享的“最狠”審稿意見,保證讓妳爆笑!

• “This paper is desperate. Please reject it completely and then block the author’s email ID so they can’t use the online system in future.”(這篇論文爛到傢了。請徹底拒稿,然後封了作者的賬號,免得他日後繼續投稿。)

• “The writing and data presentation are so bad that I had to leave work and go home early and then spend time to wonder what life is about.”(寫作水平和數據展示讓我整個人都不好了,我不得不提前下班,早點回傢,甚至開始懷疑人生。)

• “The biggest problem with this manu, which has nearly sucked the will to live out of me, is the terrible writing style.”(這篇稿件的寫作風格太糟糕了,審得我都不想活了。)

• “This paper is awfully written. There is no adequate objective and no reasonable conclusion. The literature is quoted at random and not in the context of argument. I have doubts about the methods and whether the effort of data gathering is sufficient to arrive at a useful conclusion.”(這篇論文寫得太爛了。目的不明確,結論不合理。引文都是亂引的,跟正文的論證完全對不上號。我懷疑這樣的實驗方法,也懷疑他們收集的數據不足以得出有效結論。)

• “The results are as weak as wet noodles.”(結論跟濕麵條壹樣軟弱無力。)

• “The authors are amateur.”(作者怕不是個兼職的。)

• “It is a bit for me that authors have used Python statistical analysis instead of SPSS or Matlab as usual.Please,explain.”(本文用了 Python 而不是像通常用 SPSS 和 Matlab 處理數據,為啥?)

• “Did you have seizure while writing this sentence?Because I fell like I had one while reading it.”(妳寫文章的時候犯癲癇了嗎?反正我覺得我讀的時候犯了。)

• “Why chase a gene in this ridiculous organism?”(為什麽在這種荒誕的生物里追求壹個基因。)

• “This paper introduce tools to answer questions which it does not seem many people are interested in.”(本文介紹了些解決問題的工具,然而人們並不感興趣。)

• “The English language ranks this manuscript among the top 5 worst manuscripts I have ever reviewed.”(這篇文章的英語水平可以排進我看過的最爛的前五。)

• “I started reading this manuscript with much anticipation.But my enthusiasm was short lived.”(我滿懷期待讀這篇文章,但熱情很短。)

• “I have rarely a more blown-up and annoy paper in the last couple of years than this hot-air balloon manuscript.”(我過去幾年都沒讀過這篇像屁壹樣煩人的文章。)

• “Figure3.This figure is silly.”(這圖好蠢吶。)

• “This paper makes no contribution.”(這文章有錘子貢獻。)

• “But now, there are over 1000 articles on this topic. But this author have not read a single.”(這個方向至少有壹千篇文章,作者沒讀過壹篇。)

• “Reject-More holes than my grandads' string vest.”(拒了,漏洞比我爺爺的背心上的網眼還多。)

• “The biggest problem with manuscript, which has nearly sucked the will to live out of me, is the terrible writing style.”(這篇稿子審得我都想自掛東南枝了。)

• “This paper is desperate. Please reject it complete and then block The author's email ID so they can't use The online system future.”(文章太差了,麻煩封掉作者的賬號以免他以後再投稿。)

• “The writing and data presentation are so bad that I had to leave and go home early and then spend time to wonder what life is about.”(手稿和數據顯示讓我整個人都不好了,不得不提前下班,開始懷疑人生。)

• “The presentation is of a standard that I would reject from an undergraduate student.”(就算回到本科時期,我也會拒掉這種文章。)

• “This paper is, simply manure.”(這篇論文,簡直就是肥料。)

•“What the authors have done is an insult to science.”(作者所做的是對科學的侮辱。)

• “You should look closely at a career outside of science.”(妳應該仔細考慮壹下科學以外的職業。)

所以,想想如果妳平時投稿時隻是收到壹些普通的拒稿郵件,哪怕就文章內容批評幾句,已經是多麽幸運的事!

文章怎麽寫才不用慘遭審稿人“毒舌”?使用恰當的學術語言,掌握寫作技巧才是正經事。比如這個審稿意見“這篇文章的英語水平可以排進我看過的最爛的前五”,可見審稿人對語言的要求是非常高的!

另外,實在沒空潤色文章,作者們還可以體驗壹下投必得的語言潤色,助妳免遭審稿人吐槽的同時,增加論文發表的成功率。

來自審稿人的稱贊

見識過了審稿人的毒舌和幽默,再來見識壹下審稿人怎麽誇人。但當審稿人遇到非常棒的論文,也會給出衷心的好評。

• “Very much enjoyed reading this one, and do not have any significant comments. Wish I had thought of this one.”(這篇論文讀起來簡直是壹種享受,沒有任何意見。這麽好的點子我當初怎麽沒想到!)

• “There was little I could think of to improve this nice paper.”(這篇論文好得我都不知道要怎麽改了。)

• “This is as solid a write up as I have seen, many spend much more time and space to say considerably less. It is a perfect example of a compact report.”(這是我見過的最確鑿的報告,許多人花更多時間精力寫出來的比這個差多了。作為壹篇翔實的報告,這是壹個完美的例子。)

• “landmark paper on P. putida physiology.”(假單胞菌生理學研究的里程碑。)

• “It is always a joy to review manus such as this. Well conceived, well executed, well edited. Clean. Pristine. From start to finish.”(評審這樣的稿件是件人生樂事:構思周詳,實施得當,寫得漂亮。幹凈,純樸,從頭至尾。)

歡迎大傢留言分享讓您記憶深刻的審稿意見!

最新論文發表於Q1期刊

這是壹篇由投必得助力 Hubei Academy of Agricultural Sciences,Wuhan Lichen Biotechnology Co, Wuhan University的老師和學生們發表於Journal of Plant Physiology期刊的SCI論文。下麵是論文標題!

論文標題

論文下載地址:

https://doi.org/10.1016/j.jplph.2022.153688

有需要的讀者可以自行下載!

這篇論文2021年12月2日提交,已經於2022年3月25日接受,2022年4月14日線上見刊,耗時近5個月。這篇論文本身具有很高的研究價值和重大的研究成果,又有投必得專業論文編輯為寫作質量保駕護航,成功發表屬於意料之中!

• Received2December2021,

• Revised24March2022,

• Accepted25March2022,

• Availableonline14April2022,

• VersionofRecord21April2022.

這篇論文的Acknowledgements部分,作者對投必得潤色編輯服務予以致謝!我們由衷感謝作者團隊對我們的信任和支持!

論文致謝

詳情請看:

投必得提供了“投稿期刊推薦”服務,旨在幫助您更好地了解自己稿件的水平,劃定合適的投稿期刊範圍,從而讓您在期刊選擇時避免走不必要的彎路,縮短稿件被接受的周期。編輯會根據您的文章先進行編輯前評審評估,總結成壹份預評估報告(Pre-evaluation report);並按照您對於期刊的要求,推薦 3 個目標期刊,填寫壹份期刊推薦表。

iJournal期刊查詢

接下來我們用投必得的 iJournal 期刊查詢與選擇平臺


https://ijournal.topeditsci.com/home
)來查看壹下這本期刊的詳細信息。

Journal of Plant Physiology是壹本廣譜期刊,歡迎植物生理學所有主要領域的高質量投稿,包括植物生物化學、功能生物技術、計算和合成植物生物學、生長和發育、光合作用和呼吸作用、運輸和易位,植物-微生物相互作用、生物和非生物脅迫。從分子和細胞到有機體及其環境,所有整合水平的研究都受到歡迎,並有望使用最先進的方法。純基因表達研究不在我們期刊的重點範圍內。要考慮發表,論文必須對生理過程的機制理解做出重大貢獻,而不僅僅是描述性的,或證實以前的結果。我們鼓勵提交探索非模型以及公認模型物種的生理學以及連接基礎研究和應用研究的論文。例如,對顯示出提高農業效率的新生理機制的農業植物的研究是受歡迎的。在不受控制的情況下進行的研究(例如現場條件)不提供機械洞察力將不被考慮發表。(以上機器翻譯,僅供參考)

ISSN:0176-1617

出版商:ELSEVIERGMBH

影響因子:3.549(2020年)

期刊官網:

JournalofPlantPhysiology|ScienceDirect.combyElsevier

影響因子

分區截圖

年發文量

iJournal 提供了期刊詳情、基礎版、升級版中科院 JCR 分區、科睿唯安的 JCR 分區、最新影響因子(IF)、引用因子、高引用文章、發文量等信息,有助於您的選刊。此外,投必得提供投稿期刊推薦服務,歡迎大傢咨詢!

寫在最後

以上分析,僅為壹傢之言,如有不當,敬請指出。僅供參考~