【问题标题】:Apache Spark read array float from CSV using Java [duplicate]Apache Spark使用Java从CSV读取数组浮点数[重复]
【发布时间】:2019-05-15 11:29:34
【问题描述】:

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

我正在阅读这个 CSV:

[CSV data image][1] https://imgur.com/a/PdrMhev

我正在尝试以这种方式获取数据:

Dataset<Row> 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...|
+-------+-------------+-----------------+

正如您在架构中看到的,我将数组读取为字符串,但我想获取数组。推荐?

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

谢谢你们!!!!!!!!!

【问题讨论】:

  • 能否展示您的 CSV 文件示例。
  • CSV 格式不支持数组。因此,您只想使用 dataVector 字符串中的 with 列构建一个数组
  • @BSeitkazin 是的,当然。在主帖中编辑。
  • @BSeitkazin StackOverFlow 不让我放照片,所以我放了一个链接来告诉你我的 CSV 怎么样。

标签: java arrays apache-spark apache-spark-sql apache-spark-mllib


【解决方案1】:

首先定义您的架构,

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

【讨论】:

  • 感谢您的回复!我正在尝试使用它,但是当我尝试这样做时出现下一个错误:java.base/java.lang.String cannot be cast to java.base/java.lang.Long 可能是什么?谢谢@Mahmoud !!
  • 再次感谢您!但对我不起作用,它给了我这个错误:Caused by: java.lang.NumberFormatException: For input string: "-0.41" at java.base/java.lang.NumberFormatException.forInputString 不知道发生了什么!你试过这个代码吗??
  • 您只需要将字符串转换为 Long。使用你自己的代码,我写的答案是在自定义模式中读取 df
猜你喜欢
  • 2011-04-05
  • 2021-06-22
  • 2017-08-16
  • 1970-01-01
  • 1970-01-01
  • 2018-08-25
  • 2018-09-08
  • 2020-10-08
  • 1970-01-01
相关资源
最近更新 更多