我有一个scala代码,它将csv作为输入,读取每一行,执行每一行的文档分类,并将预测的文档标签存储到MySQL数据库中。
代码片段的问题在于,有时csv有3200行,完成整个操作需要花费大量时间。我需要转换此代码,例如csv在执行程序之间分配,执行文档预测并存储标签。
以下是代码段 -
val reader = new CSVReader(new FileReader(args(4)))
var readFirstLine = false;
for (row <- reader.readAll) {
if(readFirstLine) {
var date = row(1).split(" ");
var split_date = date(0).split('-').toList;
val documentTransformed = tf.transform(row(2).split(" "))
val emotionPredicted = model.predict(documentTransformed)
val emotionMapped = emotionMaps(emotionPredicted);
//Insert Emotions
var query = "insert into emotions_values(user_id, year, month, day, emotion)" + "values ('"+ args(5) +"', '"+ split_date(0) +"', '"+ split_date(1) +"', '"+ split_date(2) +"', '"+ emotionMapped +"')";
statement.executeUpdate(query)
val polarityPredicted = polarityModel.predict(documentTransformed)
val polarityMapped = polarityMaps(polarityPredicted);
//Insert Polarity
var polarityQuery = "insert into polarity_values(user_id, year, month, day, polarity)" + "values ('"+ args(5) +"', '"+ split_date(0) +"', '"+ split_date(1) +"', '"+ split_date(2) +"', '"+ polarityMapped +"')";
statement.executeUpdate(polarityQuery)
}
else {
readFirstLine = true;
}
}
答案 0 :(得分:0)
您需要做的就是使用Spark中的内置CSV功能:
sparkSession.read
.option("header", "true")
.option("inferSchema", "true") //Maybe
.csv(args(4))
.rdd { row =>
...
}
这会将您的CSV内容转换为RDD
,然后您可以根据需要进行操作。请注意,只需将header
选项设置为true
即可忽略第一行。
我建议您查看是否可以使用DataFrame
方法返回的csv
- 这将使您能够利用Spark中的Catalyst optimizations - 而不是RDD
方法返回的rdd
。