使用java spark从csv读取列

时间:2014-11-08 20:25:05

标签: java csv apache-spark

我尝试用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]

2 个答案:

答案 0 :(得分:2)

要进行基于地图缩减的矩阵转置,这基本上就是被问到的,你将继续:

  1. 将您的行转换为索引元组:(提示:使用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)]
    
  2. 将列添加为每个元组的键:(提示:使用地图)

    [(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))]
    
  3. 按键分组

    [(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))])]
    
  4. 按顺序排序值并删除索引工件(提示:地图)

    [ 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();