Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala ApacheSpark:从行中提取值的问题_Scala_Apache Spark_Apache Spark Sql_Spark Dataframe_Apache Spark Dataset - Fatal编程技术网

Scala ApacheSpark:从行中提取值的问题

Scala ApacheSpark:从行中提取值的问题,scala,apache-spark,apache-spark-sql,spark-dataframe,apache-spark-dataset,Scala,Apache Spark,Apache Spark Sql,Spark Dataframe,Apache Spark Dataset,我在Spark的Row课程中遇到了很多问题。在我看来,Row类是一个设计非常糟糕的类。从一行中提取值应该不会比从Scala列表中提取值更困难;但实际上,为了提取它,您必须知道列的确切类型。您甚至不能将列转换为字符串;对于Spark这样的伟大框架来说,这有多荒谬?在现实世界中,在大多数情况下,您不知道列的确切类型,而且在许多情况下,除此之外,您还有几十列或数百列。下面是一个示例,向您展示我得到的ClassCastException 有没有人能从一行中轻松提取值 scala> val df =

我在Spark的Row课程中遇到了很多问题。在我看来,Row类是一个设计非常糟糕的类。从一行中提取值应该不会比从Scala列表中提取值更困难;但实际上,为了提取它,您必须知道列的确切类型。您甚至不能将列转换为字符串;对于Spark这样的伟大框架来说,这有多荒谬?在现实世界中,在大多数情况下,您不知道列的确切类型,而且在许多情况下,除此之外,您还有几十列或数百列。下面是一个示例,向您展示我得到的ClassCastException

有没有人能从一行中轻松提取值

scala> val df = List((1,2),(3,4)).toDF("col1","col2")
df: org.apache.spark.sql.DataFrame = [col1: int, col2: int]


scala> df.first.getAs[String]("col1")
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
  ... 56 elided

scala> df.first.getAs[Int]("col1")
res12: Int = 1

scala> df.first.getInt(0)
res13: Int = 1

scala> df.first.getLong(0)
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long
  at scala.runtime.BoxesRunTime.unboxToLong(BoxesRunTime.java:105)
  at org.apache.spark.sql.Row$class.getLong(Row.scala:231)
  at org.apache.spark.sql.catalyst.expressions.GenericRow.getLong(rows.scala:165)
  ... 56 elided

scala> df.first.getFloat(0)
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Float
  at scala.runtime.BoxesRunTime.unboxToFloat(BoxesRunTime.java:109)
  at org.apache.spark.sql.Row$class.getFloat(Row.scala:240)
  at org.apache.spark.sql.catalyst.expressions.GenericRow.getFloat(rows.scala:165)
  ... 56 elided

scala> df.first.getString(0)
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
  at org.apache.spark.sql.Row$class.getString(Row.scala:255)
  at org.apache.spark.sql.catalyst.expressions.GenericRow.getString(rows.scala:165)
  ... 56 elided 
Spark是一个开源项目。如果不喜欢,可以修改API。不要仅仅因为你没有得到你想要的东西就否定它。有很多选择。Spark已经尽可能地灵活了

或者,您可以执行以下操作

df.first.get(0).toString
//res0: String = 1
df.first.get(0).toString.toLong
//res1: Long = 1
df.first.get(0).toString.toFloat
//res2: Float = 1.0

我再次重申,如果您对提供的API不满意,您可以扩展现有的API并实现您的API或创建自己的API,Spark是一个开源项目。如果不喜欢,可以修改API。不要仅仅因为你没有得到你想要的东西就否定它。有很多选择。Spark已经尽可能地灵活了

或者,您可以执行以下操作

df.first.get(0).toString
//res0: String = 1
df.first.get(0).toString.toLong
//res1: Long = 1
df.first.get(0).toString.toFloat
//res2: Float = 1.0


我再次重申,如果您对提供的API不满意,您可以随时扩展现有的API并实现您的API或创建自己的API,这是为了类型安全。如果您不确定列类型,只需考虑字符串,那么对于大多数情况下,您都是很好的。这是Java Exmaple

yourDataSet.foreach(row -> {
            log.info(row.getAs("yourColumnname").toString());
        });

它在那里是为了类型安全。如果您不确定列类型,只需考虑字符串,那么对于大多数情况下,您都是很好的。这是Java Exmaple

yourDataSet.foreach(row -> {
            log.info(row.getAs("yourColumnname").toString());
        });

这肯定是答案。到目前为止,我认为自己的经验还不足以做出贡献,但你是对的,我应该开始为更多的开源项目做出贡献。这肯定是答案。到目前为止,我认为自己的经验还不足以做出贡献,但你是对的,我应该开始为更多的开源项目做出贡献。