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
Scala 如何将列表[双精度]转换为列?_Scala_Apache Spark_Dataframe_Apache Spark Sql - Fatal编程技术网

Scala 如何将列表[双精度]转换为列?

Scala 如何将列表[双精度]转换为列?,scala,apache-spark,dataframe,apache-spark-sql,Scala,Apache Spark,Dataframe,Apache Spark Sql,我有List[Double],如何将其转换为org.apache.spark.sql.Column。我正试图使用.withColumn()将其作为列插入现有的数据帧无法直接插入列不是数据结构,而是特定SQL表达式的表示形式。它不绑定到特定的数据。您必须首先转换数据。实现这一点的一种方法是并行化和按索引连接: import org.apache.spark.sql.Row 导入org.apache.spark.sql.types.{StructField,DoubleType} val df=序列

我有
List[Double]
,如何将其转换为
org.apache.spark.sql.Column
。我正试图使用
.withColumn()
将其作为列插入现有的
数据帧

无法直接插入<代码>列不是数据结构,而是特定SQL表达式的表示形式。它不绑定到特定的数据。您必须首先转换数据。实现这一点的一种方法是
并行化
按索引连接

import org.apache.spark.sql.Row
导入org.apache.spark.sql.types.{StructField,DoubleType}
val df=序列((“a”,2),(“b”,1),(“c”,0))。toDF(“x”,“y”)
val aList=列表(1.0,-1.0,0.0)
val rows=df.rdd.zipWithIndex.map(u.swap)
.join(sc.parallelize(aList).zipWithIndex.map(u.swap))
价值观
.map{case(row:row,x:Double)=>row.fromSeq(row.toSeq:+x)}
createDataFrame(行,df.schema.add(“z”,DoubleType,false))
另一种类似的方法是索引并使用和UDF处理其余部分:

import scala.util.Try

val indexedDf = sqlContext.createDataFrame(
  df.rdd.zipWithIndex.map {
    case (row: Row, i: Long) => Row.fromSeq(row.toSeq :+ i)
  },
  df.schema.add("idx_", "long")
)

def addValue(vs: Vector[Double]) = udf((i: Long) => Try(vs(i.toInt)).toOption)

indexedDf.withColumn("z", addValue(aList.toVector)($"idx_"))
不幸的是,这两种解决方案都会受到这些问题的影响。首先,通过驱动程序传递本地数据会在您的程序中引入一个严重的瓶颈。通常,数据应该直接从执行者处访问。如果您希望迭代地执行此操作,另一个问题是RDD沿袭的增长


虽然第二个问题可以通过检查点来解决,但第一个问题通常使这个想法毫无用处。我强烈建议您要么先构建完整的结构,然后在Spark上阅读,要么以可以利用Spark体系结构的方式重建管道。例如,如果数据来自外部源,则使用
map
/
mapPartitions

直接读取每个数据块
List[Double]
中的
Double
元素是什么?@JacekLaskowski,它只是一个数字列表(双数据类型),我想在现有数据框中添加为列。