转换Scala序列化代码以执行并行操作

时间:2017-04-21 13:26:26

标签: apache-spark apache-spark-sql rdd apache-spark-mllib

我有一个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;
        }
    }

1 个答案:

答案 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