例如,这是文件中的内容:
20,1,helloworld,alaaa
2,3,world,neww
1,223,ala,12341234
所需的输出”
0-> 2
1-> 3
2-> 10
3-> 8
我想找到分配给每个元素的最大长度。
答案 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
需要:
seqOp
,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)
更新:
OP的示例表明它们的长度相等。
在此答案中建议在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();
}
}