如何使用Spark scala RDD获得基于两列的运行总和

时间:2017-01-11 07:02:48

标签: scala apache-spark rdd

我在RDD中有数据有4列,如地理,产品,时间和价格。我想根据地理位置和时间计算运行总和。

给定数据

Source

我需要结果。

[Need Output like this]

我需要这个spark-Scala-RDD。我是Scala世界的新手,我可以在SQL中轻松实现这一点。我想在spark -Scala -RDD中使用(map,flatmap)。

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

这可以通过定义窗口函数来实现:

editText.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

        }

        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

        }

        @Override
        public void afterTextChanged(Editable editable) {
                String currentText = editText.getText().toString();
                if(currentText.length() > 30) {
                    editText.setText(currentText.substring(0, 30));
                }
        }

});

您可以使用Window功能执行此操作,请查看有关Windows的Databrick博客: https://databricks.com/blog/2015/07/15/introducing-window-functions-in-spark-sql.html

希望这有帮助。

快乐的火花!干杯,福克

答案 1 :(得分:1)

我认为这也有助于其他人。我试过SCALA RDD。

    val fileName_test_1 ="C:\\venkat_workshop\\Qintel\\Data_Files\\test_1.txt"


     val rdd1 = sc.textFile(fileName_test_1).map { x => (x.split(",")(0).toString() , 
                                                          x.split(",")(1).toString(),
                                                          x.split(",")(2).toString(),
                                                          x.split(",")(3).toDouble
                                                          ) 
                                                  }.groupBy( x => (x._1,x._3) )
                                                   .mapValues
                                                             { 
                                                               _.toList.sortWith
                                                               {
                                                               (a,b) => (a._4) > (b._4)
                                                               }.scanLeft("","","",0.0,0.0){
                                                                 (a,b) => (b._1,b._2,b._3,b._4,b._4+a._5)
                                                               }.tail
                                                             }.flatMapValues(f => f).values