Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.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
如何将类型Any List转换为类型Double(Scala)_Scala_Apache Spark_Mean_Databricks - Fatal编程技术网

如何将类型Any List转换为类型Double(Scala)

如何将类型Any List转换为类型Double(Scala),scala,apache-spark,mean,databricks,Scala,Apache Spark,Mean,Databricks,我是Scala的新手,我想了解一些基本的东西 首先,我需要计算数据帧中某一列的平均值,并将结果用作双类型变量 经过一些互联网研究后,我能够计算出平均值,同时使用以下命令将其传递到任意列表类型: val avgX_List = mainDataFrame.groupBy().agg(mean("_c1")).collect().map(_(0)).toList var avgX = avgX_List(0) 其中_c1是我的数据帧的第二列。这行代码返回一个类型为List[Any]的列表 为了将

我是Scala的新手,我想了解一些基本的东西

首先,我需要计算数据帧中某一列的平均值,并将结果用作双类型变量

经过一些互联网研究后,我能够计算出平均值,同时使用以下命令将其传递到任意列表类型:

val avgX_List = mainDataFrame.groupBy().agg(mean("_c1")).collect().map(_(0)).toList
var avgX = avgX_List(0)
其中_c1是我的数据帧的第二列。这行代码返回一个类型为List[Any]的列表

为了将结果传递到变量中,我使用了以下命令:

val avgX_List = mainDataFrame.groupBy().agg(mean("_c1")).collect().map(_(0)).toList
var avgX = avgX_List(0)
希望var avgX会自动转换为double类型,但这显然没有发生

现在让我们开始提问:

地图0做什么?我知道映射变换的基本定义,但我找不到这个确切参数的解释

我知道,通过在命令末尾使用.toList方法,我的结果将是一个类型为Any的列表。有没有办法把它改成包含类型双元素的列表?甚至把这个换成

您认为将我的Dataframe的列传递到List[Double]中,然后计算其元素的平均值更合适吗

基于我的问题,我在上面展示的解决方案从任何角度来看都是正确的吗?我知道它的工作原理不同于正确的解决方案吗

总之,我需要计算数据帧中某一列的平均值,并将结果作为双类型变量

注意:我是希腊人,有时很难理解一些英语编码俚语。

map\u 0是map r:Row=>r0的快捷方式,而map r:Row=>r.apply0又是map r:Row=>r.apply0的快捷方式。apply方法返回Any,因此您将丢失正确的类型。请尝试改用map_2;.getAs[Double]0或map_2;.getDouble0

收集列中的所有条目,然后计算平均值会产生很大的反效果,因为您必须将大量数据发送到主节点,然后在此单个中心节点上执行所有计算。这与Spark的好处正好相反

您也不需要collect….toList,因为您可以直接访问第0个条目—无论您是从数组还是从列表中获取它。由于您要将所有内容折叠到一行中,因此可以通过稍微重新排列方法来完全取消映射步骤:

val avgX = mainDataFrame.groupBy().agg(mean("_c1")).collect()(0).getDouble(0)
使用第一种方法,它可以写得更短:

map_0是map r:Row=>r0的快捷方式,而r0又是map r:Row=>r.apply0的快捷方式。apply方法返回Any,因此您将丢失正确的类型。请尝试改用map_2;.getAs[Double]0或map_2;.getDouble0

收集列中的所有条目,然后计算平均值会产生很大的反效果,因为您必须将大量数据发送到主节点,然后在此单个中心节点上执行所有计算。这与Spark的好处正好相反

您也不需要collect….toList,因为您可以直接访问第0个条目—无论您是从数组还是从列表中获取它。由于您要将所有内容折叠到一行中,因此可以通过稍微重新排列方法来完全取消映射步骤:

val avgX = mainDataFrame.groupBy().agg(mean("_c1")).collect()(0).getDouble(0)
使用第一种方法,它可以写得更短:


谢谢你的快速回答。你认为我找到的解决方案是有效的,基于我想要达到的结果?另外,当您说collectAsList已经存在时,您的意思是它存在于命令的.toList部分?最后,使用map.getAs[Double]0会出现以下错误:错误:扩展函数x$2=>x$2.getAs[Double]0缺少参数类型。你知道这意味着什么吗?@ArisKantas啊,不,对不起,忘了collectAsList部分,这是一个java兼容性问题,它实际上返回一个java.util.List,可能不是你想要的。map.getDouble0有效吗?或者刚才报告的错误发生了什么?答案的最后建议有效!为了理解这些方法到底是如何工作的,我必须进行更多的研究。尤其是地图。你能简单地向我解释一下为什么在这种情况下不需要地图吗?代表我表示感谢!谢谢你的快速回答。你认为我找到的解决方案是有效的,基于我想要达到的结果?另外,当您说collectAsList已经存在时,您的意思是它存在于命令的.toList部分?最后,使用map.getAs[Double]0会出现以下错误:错误:扩展函数x$2=>x$2.getAs[Double]0缺少参数类型。你知道这意味着什么吗?@ArisKantas啊,不,对不起,忘了collectAsList部分,这是一个java兼容性问题,它实际上返回一个java.util.List,可能不是你想要的。map.getDouble0是否有效,或者您刚才报告的错误发生了什么?最终的sug
你回答的手势奏效了!为了理解这些方法到底是如何工作的,我必须进行更多的研究。尤其是地图。你能简单地向我解释一下为什么在这种情况下不需要地图吗?代表我表示感谢!在我的代码中,你在哪里看到了collect00?它与collect0.apply0相同,因此它会丢失所有类型信息并返回任何类型信息。并不是说我声称有什么不同…这是我的示例代码。我只是说getDouble在任何数据类型的变量上都不可用,它在org.apache.spark.sql.Row上可用。再一次,我从未声称应该在任何情况下调用getDouble。你的答案试图解决一个不存在的问题。我检查过了!它工作正常:-val wa=Arrayone,two,two val wrdd=sc.parallelizewa,3.mapx=>x,1 val wdf=wrdd.toDFcol1,col2 wdf.groupBy.aggmeancol2.collect0.getDouble0Hello!谢谢你的回答。你能解释一下collect00是做什么的吗?另外,如果我想将数据帧转换为列表,您有什么建议,以便我可以采用正确的类型列表,即双精度列表?我的建议是:var trainingCoordList=trainingCoordDataFrame.collect.toList,但它返回一个类型列表[org.apache.spark.sql.Row],我不知道它到底是什么!在我的代码中,你在哪里看到了collect00?它与collect0.apply0相同,因此它会丢失所有类型信息并返回任何类型信息。并不是说我声称有什么不同…这是我的示例代码。我只是说getDouble在任何数据类型的变量上都不可用,它在org.apache.spark.sql.Row上可用。再一次,我从未声称应该在任何情况下调用getDouble。你的答案试图解决一个不存在的问题。我检查过了!它工作正常:-val wa=Arrayone,two,two val wrdd=sc.parallelizewa,3.mapx=>x,1 val wdf=wrdd.toDFcol1,col2 wdf.groupBy.aggmeancol2.collect0.getDouble0Hello!谢谢你的回答。你能解释一下collect00是做什么的吗?另外,如果我想将数据帧转换为列表,您有什么建议,以便我可以采用正确的类型列表,即双精度列表?我的建议是:var trainingCoordList=trainingCoordDataFrame.collect.toList,但它返回一个类型列表[org.apache.spark.sql.Row],我不知道它到底是什么!