【问题标题】:cast List<Row> to List<T> in java在 java 中将 List<Row> 转换为 List<T>
【发布时间】:2017-05-28 03:51:13
【问题描述】:

我从 cassandra 表中选取值并将它们存储在数据集中,如下所示:

Dataset query =spark.sql("select url,sourceip,destinationip from traffic_data");
List<Row> = query.collectAsList();

现在我有一个 POJO 类 GroupClass,其变量为 url、sourceip 和 destionationip。

Is it possible to cast this List<Row> to List<GroupClass>?

【问题讨论】:

标签: java apache-spark


【解决方案1】:

从技术上讲,您可以,但这会在运行时抛出 ClassCastException

在这种情况下,最佳做法是使用Copy Constructor

【讨论】:

    【解决方案2】:

    我来自 scala,但我相信 java 中也有类似的方法。

    可能的解决方案如下:

    val query =spark.sql("select url,sourceip,destinationip from traffic_data").as[GroupClass]
    

    现在查询值的类型为Dataset[GroupClass],因此调用collectAsList() 方法会返回一个List[GroupClass]

    val list = query.collectAsList();
    

    另一个解决方案(我认为你必须使用streams 在java 中做同样的事情)是map 每个RowGroupClass 列表中像这样:

    val query =spark.sql("select url,sourceip,destinationip from traffic_data")
    val list = query.collectAsList();
    val mappedList = list.map {
      case Row(url: String,sourceip: String,destinationip: String) => 
      GroupClass(url, sourceip, destinationip)
    }
    

    我认为所有属性(url、sourceip、destinationip)都有String

    你必须创建GroupedClass

    GroupClass(url: String,sourceip: String,destinationip: String)
    

    希望对你有帮助

    【讨论】:

    • 如果您使用上面的代码,它绝对会显示为错误,因为正如我上面所说,此代码是针对 scala 的。无论如何,请分享此错误,以便我们为您提供帮助!
    【解决方案3】:

    你应该为此使用编码器

    Dataset schools = context
    .read()
    .json("/schools.json")
    .as(Encoders.bean(University.class));
    

    更多信息可以在这里找到https://databricks.com/blog/2016/01/04/introducing-apache-spark-datasets.html 或者这里https://jaceklaskowski.gitbooks.io/mastering-apache-spark/content/spark-sql-Encoder.html

    【讨论】:

      猜你喜欢
      • 2021-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-20
      • 1970-01-01
      • 2012-02-14
      相关资源
      最近更新 更多