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,它只是一个数字列表(双数据类型),我想在现有数据框中添加为列。