我尝试用java和spark读取csv。
现在我这样做:
String master = "local[2]";
String csvInput = "/home/username/Downloads/countrylist.csv";
String csvOutput = "/home/username/Downloads/countrylist";
JavaSparkContext sc = new JavaSparkContext(master, "loadwholecsv", System.getenv("SPARK_HOME"), System.getenv("JARS"));
JavaRDD<String> csvData = sc.textFile(csvInput, 1);
JavaRDD<List<String>> lines = csvData.map(new Function <String, List<String>>() {
@Override
public List<String> call(String s) {
return new ArrayList<String>(Arrays.asList(s.split("\\s*,\\s*")));
}
});
所以我将csv文件的所有“行”作为我的RDD中的一行。我还写了这个方法来获取一个列:
public static JavaRDD<String> getColumn (JavaRDD<List<String>> data, final int index)
{
return data.flatMap(
new FlatMapFunction <List<String>, String>()
{
public Iterable<String> call (List<String> s)
{
return Arrays.asList(s.get(index));
}
}
);
}
但是后来我想对列进行很多转换并改变列的位置等等。因此,将一个RDD填充为COLUMNS作为Arraylists而不是LINES会更容易。
有谁知道如何实现这一目标?我不想n次调用“getColumn()”。
如果你可以帮助我会很棒。
说明: 我的csvData看起来像这样:
one, two, three
four, five, six
seven, eight, nine
我的行RDD看起来像这样:
[one, two, three]
[four, five, six]
[seven, eigth, nine]
但是我想要这个:
[one, four, seven]
[two, five, eight]
[three, six, nine]
答案 0 :(得分:2)
要进行基于地图缩减的矩阵转置,这基本上就是被问到的,你将继续:
将您的行转换为索引元组:(提示:使用zipWithIndex和map)
[(1,1,one), (1,2,two), (1,3,three)] [(2,1,four), (2,2,five), (2,3,six)] [(3,1,seven), (3,2,eigth), (3,3,nine)]
将列添加为每个元组的键:(提示:使用地图)
[(1,(1,1,one)), (2,(1,2,two)), (3,(1,3,three))] [(1,(2,1,four)), (2,(2,2,five)),(3,(2,3,six))] [(1,(3,1,seven)), (2,(3,2,eigth)), (3,(3,3,nine))]
按键分组
[(1,[(3,1,seven), (1,1,one), (2,1,four)])] [(2,[(1,2,two), (3,2,eigth), (2,2,five)])] [(3,[,(2,3,six),(1,3,three), (3,3,nine))])]
按顺序排序值并删除索引工件(提示:地图)
[ one, four, seven ] [ two, five, eigth ] [ three, six, nine ]
答案 1 :(得分:0)
SparkSession spark = SparkSession.builder().appName("csvReader").master("local[2]").config("com.databricks.spark.csv","some-value").getOrCreate();
String path ="C://Users//U6048715//Desktop//om.csv";
Dataset<org.apache.spark.sql.Row> df =spark.read().csv(path);
df.show();