apache-spark - 在数据框中将字符串转换为 double

标签 apache-spark apache-spark-sql

我已经使用生成字符串的 concat 构建了一个数据框。

import sqlContext.implicits._

val df = sc.parallelize(Seq((1.0, 2.0), (3.0, 4.0))).toDF("k", "v")
df.registerTempTable("df")

val dfConcat = df.select(concat($"k", lit(","), $"v").as("test"))

dfConcat: org.apache.spark.sql.DataFrame = [test: string]

+-------------+
|         test|
+-------------+
|      1.0,2.0|
|      3.0,4.0|
+-------------+

我怎样才能将它转换回 double?

我尝试转换为 DoubleType 但我得到的是 null

import org.apache.spark.sql.types._
 intterim.features.cast(IntegerType))

val testDouble = dfConcat.select( dfConcat("test").cast(DoubleType).as("test"))

+----+
|test|
+----+
|null|
|null|
+----+

udf在运行时返回数字格式异常

import org.apache.spark.sql.functions._

val toDbl    = udf[Double, String]( _.toDouble)

val testDouble = dfConcat
.withColumn("test",      toDbl(dfConcat("test")))              
.select("test")

最佳答案

您不能将它转换为 double,因为它根本不是有效的 double 表示形式。如果你想要一个数组,只需使用 array 函数:

import org.apache.spark.sql.functions.array

df.select(array($"k", $"v").as("test"))

您也可以尝试拆分和转换,但这远非最佳:

import org.apache.spark.sql.types.{ArrayType, DoubleType}
import org.apache.spark.sql.functions.split

dfConcat.select(split($"test", ",").cast(ArrayType(DoubleType)))

关于apache-spark - 在数据框中将字符串转换为 double ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35971380/

相关文章:

apache-spark - Spark 结构化流在追加模式下显示结果太迟

python-2.7 - pyspark : how to generate time series? 上的 SparkSQL

java - 如何在 Spark Java 中使用 StructType Schema 从 JavaRDD<String> 读取 csv 格式数据

python - 在 Pyspark 中过滤具有空数组的列

python - 使用 pyspark 将结构数组转换为列 - 不分解数组

apache-spark - 如果我通过 pip install pyspark 安装了 pyspark,在哪里修改 spark-defaults.conf

java - Spark SQL sql ("<some aggregate query>").first().getDouble(0) 给我不一致的结果

scala - Spark MLlib ALS 中的非整数 ID

scala - 如何将包含值 0...n 的列添加到 Spark 中的现有数据帧?

apache-spark - 向 Spark DataFrame 添加一列并为其计算值