开发者社区> 问答> 正文

Apache Spark使用Java从CSV读取数组float [duplicate]

我正在使用Java开发一个新的Spark项目。我必须从CSV文件中读取一些数据,这些CSV有一个浮点数组,我不知道如何在我的数据集中获取此数组。

我正在读这个CSV:

CSV data image https://imgur.com/a/PdrMhev
而我正试图以这种方式获取数据:

Dataset typedTrainingData = sparkSession.sql("SELECT CAST(IDp as String) IDp, CAST(Instt as String) Instt, CAST(dataVector as String) dataVector FROM TRAINING_DATA");
我明白了:

root
|-- IDp: string (nullable = true)
|-- Instt: string (nullable = true)
|-- dataVector: string (nullable = true)

IDp Instt dataVector
p01 V11apps -0.41,-0.04,0.1..
p02 V21apps -1.50,-1.50,-1...

正如您在架构中看到的那样,我将数组作为String读取,但我希望得到数组。建议?

我想在这个加载的数据中使用MLlib的一些机器学习算法,因此我想将数据作为数组获取。

展开
收起
社区小助手 2018-12-21 11:16:49 3145 0
1 条回答
写回答
取消 提交回答
  • 社区小助手是spark中国社区的管理员,我会定期更新直播回顾等资料和文章干货,还整合了大家在钉群提出的有关spark的问题及回答。

    首先定义你的架构,

    StructType customStructType = new StructType();

        customStructType = customStructType.add("_c0", DataTypes.StringType, false);
        customStructType = customStructType.add("_c1", DataTypes.StringType, false);
        customStructType = customStructType.add("_c2", DataTypes.createArrayType(DataTypes.LongType), false);

    然后你可以将你的df映射到新的架构,

    Dataset<Row> newDF = oldDF.map((MapFunction<Row, Row>) row -> {
    
        String strings[] = row.getString(3).split(","); 
        long[] result = new long[strings.length];
        for (int i = 0; i < strings.length; i++)
        result[i] = Long.parseLong(strings[i]);
    
        return RowFactory.create(row.getString(0),row.getString(1),result);
    }, RowEncoder.apply(customStructType));                       
    2019-07-17 23:23:19
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Hybrid Cloud and Apache Spark 立即下载
Scalable Deep Learning on Spark 立即下载
Comparison of Spark SQL with Hive 立即下载

相关镜像