使用Scala计算分配给每个元素的最大长度

时间:2018-06-25 20:05:36

标签: scala apache-spark

例如,这是文件中的内容:

20,1,helloworld,alaaa
2,3,world,neww
1,223,ala,12341234

所需的输出”

0-> 2
1-> 3
2-> 10
3-> 8

我想找到分配给每个元素的最大长度。

3 个答案:

答案 0 :(得分:0)

我建议使用RDD的aggregate方法:

val rdd = sc.textFile("/path/to/textfile").
  map(_.split(","))
// res1: Array[Array[String]] = Array(
//   Array(20, 1, helloworld, alaaa), Array(2, 3, world, neww), Array(1, 223, ala, 12341234)
// )

val seqOp = (m: Array[Int], r: Array[String]) =>
  (r zip m).map( t => Seq(t._1.length, t._2).max )

val combOp = (m1: Array[Int], m2: Array[Int]) =>
  (m1 zip m2).map( t => Seq(t._1, t._2).max )

val size = rdd.collect.head.size

rdd.
  aggregate( Array.fill[Int](size)(0) )( seqOp, combOp ).
  zipWithIndex.map(_.swap).
  toMap
// res2: scala.collection.immutable.Map[Int,Int] = Map(0 -> 2, 1 -> 3, 2 -> 10, 3 -> 8)

请注意,aggregate需要:

  1. 以0组成的数组(其大小等于rdd的行大小)作为初始值,
  2. 用于计算分区内最大字符串长度的函数seqOp
  3. 另一个函数combOp,用于将分区中的结果组合为最终的最大值。

答案 1 :(得分:0)

可以将其扩展为任意数量的列。首先将文件作为数据框读取:

val df = spark.read.csv("path")

然后为每个列创建一个SQL表达式,并使用expr对其求值:

val cols = df.columns.map(c => s"max(length(cast($c as String)))").map(expr(_))

选择新列作为数组,并隐藏到Map

df.select(array(cols:_*)).as[Seq[Int]].collect()
  .head
  .zipWithIndex.map(_.swap)
  .toMap

这应该给您想要的Map

Map(0 -> 2, 1 -> 3, 2 -> 10, 3 -> 8)

答案 2 :(得分:-1)

更新:

  1. OP的示例表明它们的长度相等。

  2. 在此答案中建议在DF列上使用Spark-SQL和max(length(length))。

您可以这样做:

package com.Graphics;

import java.awt.*;
import java.awt.image.*;
import javax.swing.*;

public class GraphicsMain {

    public static void main(String[] args) {

        GraphicsMain myGraphics = new GraphicsMain();

        myGraphics.createDisplay();

    }

    void createDisplay(){

        int width = 500;
        int height = 500;
        String title = "TestFrame";
        Graphics g;

        Canvas myCanvas = new Canvas();
        JFrame myFrame = new JFrame(title);

        myFrame.setVisible(true);
        myFrame.setResizable(false);
        myFrame.setSize(width, height);
        myFrame.setLocationRelativeTo(null);
        myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        myCanvas.setPreferredSize(new Dimension(500, 500));
        myCanvas.setMaximumSize(new Dimension(500, 500));
        myCanvas.setMinimumSize(new Dimension(500, 500));

        myFrame.add(myCanvas);
        myFrame.pack();

        myCanvas.createBufferStrategy(2);

        BufferStrategy bs = myCanvas.getBufferStrategy();

        g = bs.getDrawGraphics();

        g.setColor(Color.red);
        g.fillRect(10, 50, 50, 70);

        bs.show();
        g.dispose();
    }
}