Spark 构建DataFrame将String改为Double
更新:
1 cast(DoubleType) 可以替换为cast(”double“) , 同理也可变为”string“,”float“,”boolean“等等!!!
2 如果将name或者live等非数值型用cast转化为int或者double,结果显示name所有列为 null , 但是查看列类型时,name->BooleanType 转换成功了!!!
由于Spark中构造Dataframe 即使是数值类型的数据 也需要以String形式进行创建,
var data = Seq(
("0.1","0"),
("0.15","0"),
("0.8","1"),
("1.0","1")
).toDF("predict","label")
+-------+-----+
|predict|label|
+-------+-----+
| 0.1| 0|
| 0.15| 0|
| 0.8| 1|
| 1.0| 1|
+-------+-----+
或者:
val data = Array(("1", "2", "3", "4", "5"), ("6", "7", "8", "9", "10"))
val df = spark.createDataFrame(data).toDF("col1", "col2", "col3", "col4", "col5")
+----+----+----+----+----+
|col1|col2|col3|col4|col5|
+----+----+----+----+----+
| 1| 2| 3| 4| 5|
| 6| 7| 8| 9| 10|
+----+----+----+----+----+
如果需要行内数据的计算和比较,需要将其转化为数值型,这里以Double为例:
- 方法一:单列转化方法 利用sql思想
import org.apache.spark.sql.functions._
df.select(df.col("col1").cast(DoubleType)).show()
结果:
+----+
|col1|
+----+
| 1.0|
| 6.0|
+----+
- 方法二:循环转变 利用for
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.types._
import org.apache.spark.sql.DataFrame
val colNames = df.columns
var df1 = df
for (colName <- colNames) {
df1 = df1.withColumn(colName, col(colName).cast(DoubleType))
}
df1.show()
结果:
+----+----+----+----+----+
|col1|col2|col3|col4|col5|
+----+----+----+----+----+
| 1.0| 2.0| 3.0| 4.0| 5.0|
| 6.0| 7.0| 8.0| 9.0|10.0|
+----+----+----+----+----+
查看一下df1的
df1.types
res109: Array[(String, String)] = Array((col1,DoubleType), (col2,DoubleType), (col3,DoubleType), (col4,DoubleType), (col5,DoubleType))
- 方法三:通过:_*
scala 有array:_*这样传参这种语法,而df的select方法也支持
val cols = colNames.map(f => col(f).cast(DoubleType))
df.select(cols: _*).show()
这样就可以很方便的查询指定多列和转变指定列的类型了:
val name = "col1,col3,col5"
df.select(name.split(",").map(name => col(name)): _*).show()
df.select(name.split(",").map(name => col(name).cast(DoubleType)): _*).show()
Spark 构建DataFrame将其他类型改为String
data = data.withColumn(colname, data.col(colname).cast("string"))
或者:
val colNames =data.columns
val cols = colNames.map(f => col(f).cast(StringType))
或者在存储时进行更改:
data.coalesce(1).map(i =>
i.toString).toDF().write.mode(SaveMode.Overwrite).option("sep","#").option("header","true").csv(output_pt+"_text")
原文转载自:https://www.jianshu.com/p/0634527f3cce

本文详细介绍如何在Spark中使用DataFrame将String类型数据转换为Double类型,包括单列转换、批量转换和选择性转换的方法,适用于数据预处理和分析场景。

1679

被折叠的 条评论
为什么被折叠?



